目的
pythonでnumpy配列を扱う何がしかのコードを書く時のあるある、久しぶりに書くと目的をスマートに達成するうまい書き方がわからない。配列は特にうまい書き方をするかしないかによってコードの行数にもろに響いてくる。forのネストでぶん回すのとか昔のC言語感しかしないよね。
メモなので随時加筆型。適当にチェンジログでもつけておこうかな。
2019/05/30 ページ作成
配列の初期化
- np.zeros, np.ones
それぞれ要素の値が全て0の配列、要素の値が全て1の配列を作成。shapeを表すタプルを与えるとその形の配列を作成する。
import numpy as np x0, x1 = np.zeros(10), np.ones(10) y0, y1 = np.zeros((5,5)), np.ones((5,5)) z0, z1 = np.zeros((3,3,3)), np.ones((3,3,3))
これらは全てOK。各要素の型をキーワード引数dtypeで指定することもできる。よく使うのは以下。
x = np.zeros(100, dtype=int) y = np.ones(100, dtype=np.float64)
他もあるがまあいいだろう。整数か浮動小数点かくらいは使い分けられると不要なキャストが無くなって嬉しい。
- np.random.randn, np.random.rand
それぞれ正規分布に従う乱数、0-1の一様乱数に従う乱数を要素の値とする配列を変えす。こちらはshapeを表すタプルではなくそのまま指定していく。
import numpy as np x = np.random.randn(10) y = np.random.rand(10,10) z = np.random.rand(10,10,10,10,10)
最後のもOK。zeros,onesと出し方が違うのでいつもどちらかでつまずく。これらの乱数があれば任意の平均と分散の正規分布は作れるし任意の範囲の一様乱数も作れる。numpyの演算は要素ごとなので足したり定数かけたりは全て要素ごと。
- CSVファイルから読み込む
import numpy as np x = np.random.randn(10,10) np.savetxt('filename.csv', x, delimiter=',') y = np.genfromtxt('filename.csv', delimiter=',')
これはよくある。なぜデフォルトのdelimiterをコンマにしてくれないんだろう。
- ファイルから読み込むscipy.io.loadmat
import numpy as np import scipy.io as sio mat = sio.loadmat('filename.mat') X = mat['name']
これは需要低い。まれにmatファイルを扱う場面に遭遇する。