import numpy as np
import matplotlib.pyplot as plt
# jupyter notebookに画像を表示
%matplotlib inline
x = np.array([1, 2, 5, 10])
x
x.dtype
plt.plot(x) #matplotlibにndarrayを渡せる
x = np.array([1., 4., 0.5]) # float(浮動小数)で初期化するとdtypeが自動的にfloatになる
x
x.dtype
Python組み込み関数のrange()と似ていますが、さらに高機能な関数で、ndarrayを返します。
np.arange(10) # 0から9まで
np.arange(3, 10) # 3から9まで
np.arange(0, 10, 0.5) # 0から10まで0.5刻み(10は含まない)
# 整数ステップ
np.arange(0, 20, 4)
np.onesは、引数で与えられたshapeで、全ての要素が1であるようなndarrayを返します。
np.ones(5)
np.ones((2, 5)) # 多次元配列ver.
x = np.array([10, 3, -1, 3, 0])
x
np.ones_like(x) # xのようなshape, dtypeで、要素が全て1の配列
全ての要素を0にする他は、np.ones, np.ones_likeと同じです。
np.zeros(5)
np.zeros((5, 2))
上の2つと似ていますが、こちらは初期化をせずに配列の領域だけを確保する関数です。
巨大な配列を自分で初期化したい場合や、値は何でもいいが配列だけ作りたいときに使います。
初期化のプロセスを省略するためにnp.zerosなどよりも高速に動作します。
ときどき変な値が入ってることがあるので、自分ですべての要素をあとで初期化するときのみ使うのが吉です。
# 2048個のbool型の中にあるTrueの個数(実行するたびに変化する)
for i in range(5):
print(np.empty(2048, dtype=bool).sum())
x = np.empty(10)
x[::2] = 1 # 自分で初期化
x[1::2] = 2
x
ある範囲を均等に分割する関数です。
連続的な配列を作るときに非常に便利です。
デフォルトで50個に分割します。
np.linspace(0, 1) # 0から1まで50個分割した配列
np.linspace(0, 1, 10) # 3つ目の引数は個数を表す。
t = np.linspace(0, 2 * np.pi) # 0から2πまで50個に分割する。
plt.plot(t, np.sin(t)) # なんだかなめらかに見える
#endpoint=Falseの場合。stopの値を含まない。
np.linspace(0, 1, 10, endpoint=False)
この2つは単位行列を生成する関数です。
np.eye(4) # 4×4の単位行列
a = np.arange(10)
a
b = a.reshape(2, 5)
b
例えば、x, y, zが並んだバイナリデータを一次元配列として読み取ったあと、reshapeすれば、2次元配列として扱えます。
文字通り、ndarrayのshapeを変更する関数なのですが、2つほど注意する点があります。
一つ目は、全体のsizeを変更しないようにしなければならないということです。
つまり、新しいshapeの各要素を掛け合わせた値が元々の要素の総数を一致する必要があるということです。
#ndarray.sizeは配列に含まれるデータの総数
a.size
# total sizeが変化しているので怒られる
# a.reshape(1000, 100000) ==> ValueError: total size of new array must be unchanged
逆に言うと、sizeが同じであるならば、どのようなshapeでも作ることが出来ます。
a.reshape(1, 1, 2, 1, 5)
このような変形は、次元の異なる配列同士の計算をするために用いることがあります(ブロードキャスト)。
また、reshapeの引数に-1を入れると、sizeを変えないようなshapeを計算してくれます。
a = np.arange(10)
a.reshape(-1, 5) # reshape(2,5)と等価
二つ目の注意する点は、reshapeによって返ってくるndarrayは、元々のndarrayと同じメモリを参照している点です。
つまり、reshapeによって返ってきたndarrayを書き換えると、オリジナルも変化するということです。
このような参照をコピーと対比させて、ビューと言います。
b = np.arange(10) # オリジナル
c = b.reshape(2,5) # reshapeされたビュー
c[0, 0] = 100 # ビューを書き換える
b # オリジナルが変わる
科学技術計算の上ではこの性質は重要です。なぜなら、大規模な配列をいちいちreshapeのたびにコピーされると困るからです。
もし、オリジナルを書き換えたくないならば、copy関数を使う必要があります。
b = np.arange(10)
c = b.reshape(2,5).copy() # copyは複製したndarrayを返す
c[0, 0] = 100
b