Py淡

Python, Python, Python! In the spirit of "import antigravity"

np.ones_like, np.zeros_likeでboolアレイの初期化。

覚書です。

array1 = np.zeros((w,h))

なんかであらかじめプリアロケーションしたゼロ行列を作ることはよくありますが、ブーリアンのときはどうやるとスマートなのかと思って調べました。

bool値で満たされた行列の初期化

私の場合、既にあるmyarrayと同じ次元のマスクが欲しい時は

mask = np.ones(myarray.shape, dtype=np.bool) * False

でFalseの部分を必要に応じて変えて急場をしのいでましたが、

どうせmyarray.shapeってやるならnp.ones_likeをつかって

mask = np.ones_like(myarray, dtype=np.bool) * False

と書くべきだし、ones_likeだとTrueの行列になるので

mask = np.zeros_like(myarray, dtype=np.bool)

がスマートな方法っぽい。

boolに限らずもっと一般的な方法としてはあまり使ったことなかったけどnp.full_likeというのがあって、第二引数の値で満たされた行列を作れる。

mask = np.full_like(myarray, Flase, dtype=np.bool)

または

mask = np.full_like(myarray, True, dtype=np.bool)

nanで満たされた行列の初期化


np.full_likeを使うとnanで満たされた行列の初期化がスマートになります。

mask = np.full_like(myarray, np.nan)

でいけます。いままではnp.onesにnp.nanをかけていたけどこっちのほうがスマートですね。

np.emptyはいつ使うのか

np.zerosに似たnp.emptyは初期化しないでメモリだけ確保するので、次元とデータ型は正しいが、確保されたメモリに残っているめちゃめちゃな値の行列ができる。全要素を上書きするのが確定している場合にはいいけど、忘れそうで危険なので使わないことにしている。そこまでパフォーマンスにこだわる状況っていまのところあまりない。