📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

Python 下調べ - Rubyist の Python 学習記録(2)

💡
この記事は Middleman 時代に書いた古いものです。記録のため、astro-notion-blog に移行していますが、あまり参考にしないでください。
プログラム記述前に調査したこと

いきなり調べながらプログラムを記述するとその言語の特徴を活かせないので,私の場合はその言語の特徴を先に色々と調査している. ここでは,順不同に Python の特徴と思われることをまとめておく. それぞれには参照したページのリンクを記載しておく. 今後,プログラムを書いているうちにわかったことがあればここに追記する.

Numpy

Numpy は Python における数値計算ライブラリである. 様々な数値演算のライブラリが存在するが,それらはほとんど全てこの NumPy の上で動作するものである.Python がインタプリタでありながら,数値計算に多く用いられるのは内部が C で実装されたこの NumPy のおかげである. NumPy で特に気になったものはスライスである. NumPy の ndarray のスライスは view である.部分配列を取り出した時に,その配列要素を変更すると,元の配列のデータが変更される.これまで私が作ってきた窓ベクトル,窓行列は Numpy の ndarray であればそのまま実現可能である. 

Numpy のデータ構造

スライスが気になったので,NumPy のデータ構造を説明した文書を調べてみた.ndarray の内部では strides というメモリの移動量を記録したものがあった.以前,大昔に私が実装していた窓の仕組みと同じであった.みんな考えることは一緒だなと安心した. 

NumPy の ndarry の比較

NumPy の ndarray の比較は要素ごとの値の比較が行われる.ndarray 自体が等しいかどうかを判断するなら == の後に all() を使って全ての要素が等しいか調べる必要がある.

画像の読み込み

NumPy 自体は画像の読み込み機能はない.画像を取り扱うパッケージとしては,OpenCV, Pillow, Scikit-image などがある.この中で,OpenCV だけはカラー画像の読み込みをした時に,色の順番が BGR となってしまう.その他いろいろなプログラムでは RGB の順序を意識したものが多い.cvtColor を使えば変換ができるようだがやはり面倒なので,OpenCV ではなく Scikit-image などを使っていきたいと思う. 

演算子のオーバロード

自分のクラスのオブジェクトの比較も == で実施したい.そこで,演算子のオーバロードを調べた.== で比較するためには,クラス内に __eq__(self, other) を実装すればよい.

オブジェクト指向

Ruby と違って関数がメインである.例えば,上記で紹介した Numpy のほとんどは関数である.Ruby から入った人間はどうしてもオブジェクトに仕事をしてほしいのでメソッド呼び出ししたくなるが,かなりのモジュールは関数で書かれている.純粋なオブジェクト指向というより,オブジェクト指向としても書けるくらいに思っていた方がよい.ただし,自分のライブラリでは Numpy の関数を自作のオブジェクトで包む形とし,オブジェクト指向的に書きたい. 

イテレータ

Python の iterator は __iter__ と __next__ を準備すればよい.ただし,これを使わなくても,簡単な iterator オブジェクトを生成するなら generator 関数を作ればよい.generator 関数では yield 関数を呼び出すごとに呼び出し元に戻る.この性質を使うことで無限配列のような実装も実現できる.yield は Ruby と同じ表記だが全く異なる動作をするので注意する.

複数リストに対するイテレータ

単体のリストであれば,for 文で簡単にループを回せる.画像処理では複数の画像に対して並列にループを回す必要があり,複数リストに対するイテレータ処理が必要となる.調べたところ,Ruby にもある zip を使うとよいらしい.しかも,Python 3 からはリストではなく,イテレータが返されるようだ.それであれば,generator で作った逐次的なイテレータでも対応できそうな感じがする.これは実際にコードを書いてテストしてみたい.

プロパティとデコレータ

Python にも Swift と同様にプロパティという概念がある.プロパティの setter と getter をメソッドで書く際には,@property と @プロパティ名.setter というデコレータを記載する.メソッドは共に def プロパティ名() という形を取るが,getter は self のみ,setter は self と value の二つを取る.不思議な感じがするが,デコレータの仕組みによるものである.詳しいことはリンク先に書いてあるが,今は記述方法だけ知っていればよいかと.

Python の疑似 private 変数

Python にはメンバのアクセス制限がなく,全て public とのこと.__変数名とすると疑似的に __クラスメイ__変数名という public 変数ができるだけとのこと.ただし,継承したクラスではクラス名が異なるのでトラブルになってしまう.基本的に自分の変数であろうが,プロパティ呼び出しをすべきということだろう.

三項演算子

ほとんどの言語が「条件式 ? 真の時の値 : 偽の時の値」と記述するが,Python では「真の時の値 if 条件 else 偽の時の値」と記載する.

パッケージの import

自分で作ったパッケージを自分のプログラムから import したい.基本的には NumPy と同様に import でほぼ全ての関数を呼び出せるようにしたい.NumPy では __init__.py の中でサブパッケージをインポートしているらしい. 

nose2 によるテスト記述

Python には unitest や pytest があるが,nose2 というテストフレームワークもある.Ruby の Rspec と似たような記述ができる.@it で始まるデコレータを記載することで,test メソッドの名前をいちいち考えなくてよい.

Jupyter Lab

Jupyter Notebook の拡張として用意された環境.Mathematica のカーネルとフロントエンドのような環境を提供してくれる.フロントエンドはブラウザからアクセスする.ブラウザ上で,Notebook, Python コンソール,ターミナル,テキストエディタを描画できる.残念ながら,Safari ではターミナルでの文字入力,vim キーバインドでのテキストエディタ編集はできなかった.Firefox または Chrome では動作を確認した.ブラウザさえ用意できればよいので,iPad Pro でも Python を動作させることができる.Notebook では実行したコードの結果だけでなく,グラフなども描画可能なので,このまま研究の報告書として PDF 出力することもできる.


長くなったので今日はここまで.ただし,このページは今後も更新予定.