Python 下調べ - Rubyist の Python 学習記録(2)
PythonLibrary
Python
2018年
12月
31日
プログラム記述前に調査したこと
いきなり調べながらプログラムを記述するとその言語の特徴を活かせないので,私の場合はその言語の特徴を先に色々と調査している.
ここでは,順不同に Python の特徴と思われることをまとめておく.
それぞれには参照したページのリンクを記載しておく.
今後,プログラムを書いているうちにわかったことがあればここに追記する.
- Numpy
-
Numpy は Python における数値計算ライブラリである.
様々な数値演算のライブラリが存在するが,それらはほとんど全てこの NumPy の上で動作するものである.
Python がインタプリタでありながら,数値計算に多く用いられるのは内部が C で実装されたこの NumPy のおかげである.
NumPy で特に気になったものはスライスである.
NumPy の ndarray のスライスは view である.部分配列を取り出した時に,その配列要素を変更すると,元の配列のデータが変更される.これまで私が作ってきた窓ベクトル,窓行列は Numpy の ndarray であればそのまま実現可能である.
NumPy配列ndarrayのスライスによる部分配列の選択と代入
- Numpy のデータ構造
-
スライスが気になったので,NumPy のデータ構造を説明した文書を調べてみた.ndarray の内部では strides というメモリの移動量を記録したものがあった.以前,大昔に私が実装していた窓の仕組みと同じであった.みんな考えることは一緒だなと安心した.
NumPyの多次元配列データ構造ndarrayの基礎
- NumPy の ndarry の比較
-
NumPy の ndarray の比較は要素ごとの値の比較が行われる.ndarray 自体が等しいかどうかを判断するなら == の後に all() を使って全ての要素が等しいか調べる必要がある.
[Numpy] 2つのndarrayを比較する
- 画像の読み込み
-
NumPy 自体は画像の読み込み機能はない.画像を取り扱うパッケージとしては,OpenCV, Pillow, Scikit-image などがある.この中で,OpenCV だけはカラー画像の読み込みをした時に,色の順番が BGR となってしまう.その他いろいろなプログラムでは RGB の順序を意識したものが多い.cvtColor を使えば変換ができるようだがやはり面倒なので,OpenCV ではなく Scikit-image などを使っていきたいと思う.
Python, OpenCVでBGRとRGBを変換するcvtColor
- 演算子のオーバロード
-
自分のクラスのオブジェクトの比較も == で実施したい.そこで,演算子のオーバロードを調べた.== で比較するためには,クラス内に __eq__(self, other) を実装すればよい.
Pythonでの演算子のオーバーロード
- オブジェクト指向
-
Ruby と違って関数がメインである.例えば,上記で紹介した Numpy のほとんどは関数である.Ruby から入った人間はどうしてもオブジェクトに仕事をしてほしいのでメソッド呼び出ししたくなるが,かなりのモジュールは関数で書かれている.純粋なオブジェクト指向というより,オブジェクト指向としても書けるくらいに思っていた方がよい.ただし,自分のライブラリでは Numpy の関数を自作のオブジェクトで包む形とし,オブジェクト指向的に書きたい.
Pythonのオブジェクト指向は後付けなのか?
- イテレータ
-
Python の iterator は __iter__ と __next__ を準備すればよい.ただし,これを使わなくても,簡単な iterator オブジェクトを生成するなら generator 関数を作ればよい.generator 関数では yield 関数を呼び出すごとに呼び出し元に戻る.この性質を使うことで無限配列のような実装も実現できる.yield は Ruby と同じ表記だが全く異なる動作をするので注意する.
PythonのIterableを順に追っていく
- 複数リストに対するイテレータ
-
単体のリストであれば,for 文で簡単にループを回せる.画像処理では複数の画像に対して並列にループを回す必要があり,複数リストに対するイテレータ処理が必要となる.調べたところ,Ruby にもある zip を使うとよいらしい.しかも,Python 3 からはリストではなく,イテレータが返されるようだ.それであれば,generator で作った逐次的なイテレータでも対応できそうな感じがする.これは実際にコードを書いてテストしてみたい.
Python Tips:複数のリストに対してループを回したい
- プロパティとデコレータ
-
Python にも Swift と同様にプロパティという概念がある.プロパティの setter と getter をメソッドで書く際には,@property と @プロパティ名.setter というデコレータを記載する.メソッドは共に def プロパティ名() という形を取るが,getter は self のみ,setter は self と value の二つを取る.不思議な感じがするが,デコレータの仕組みによるものである.詳しいことはリンク先に書いてあるが,今は記述方法だけ知っていればよいかと.
Pythonのプロパティ記述はよく見るとおかしい(さらによく考えればおかしくない)
- Python の疑似 private 変数
-
Python にはメンバのアクセス制限がなく,全て public とのこと.__変数名とすると疑似的に __クラスメイ__変数名という public 変数ができるだけとのこと.ただし,継承したクラスではクラス名が異なるのでトラブルになってしまう.基本的に自分の変数であろうが,プロパティ呼び出しをすべきということだろう.
Pythonの疑似private変数とクラス継承によるトラブル
- 三項演算子
-
ほとんどの言語が「条件式 ? 真の時の値 : 偽の時の値」と記述するが,Python では「真の時の値 if 条件 else 偽の時の値」と記載する.
三項演算子(Python)
- パッケージの import
-
自分で作ったパッケージを自分のプログラムから import したい.基本的には NumPy と同様に import でほぼ全ての関数を呼び出せるようにしたい.NumPy では __init__.py の中でサブパッケージをインポートしているらしい.
Python, importの使い方(from, as, PEP8の推奨スタイル, 注意点など)
- nose2 によるテスト記述
-
Python には unitest や pytest があるが,nose2 というテストフレームワークもある.Ruby の Rspec と似たような記述ができる.@it で始まるデコレータを記載することで,test メソッドの名前をいちいち考えなくてよい.
Python nose2のDSL記法でシンプルに単体テストを書く
,
nose2 の DSL 記法でテストを書く
- Jupyter Lab
-
Jupyter Notebook の拡張として用意された環境.Mathematica のカーネルとフロントエンドのような環境を提供してくれる.フロントエンドはブラウザからアクセスする.ブラウザ上で,Notebook, Python コンソール,ターミナル,テキストエディタを描画できる.残念ながら,Safari ではターミナルでの文字入力,vim キーバインドでのテキストエディタ編集はできなかった.Firefox または Chrome では動作を確認した.ブラウザさえ用意できればよいので,iPad Pro でも Python を動作させることができる.Notebook では実行したコードの結果だけでなく,グラフなども描画可能なので,このまま研究の報告書として PDF 出力することもできる.
Jupyter Lab事始め
長くなったので今日はここまで.ただし,このページは今後も更新予定.