親です。

子ども産まれたんで育児とかについて書きます。映画とか心理学とかITとかの趣味についても書きます。

【Python】NumPy - NumPyのざっくり理解

おつです。NumPyのざっくりとした理解をまとめる。

NumPyのざっくり理解

numpyって要するに配列作るやつです。NumPy.ndarray型なるもので多次元配列を扱うらしい。

ちな、チートシートはこちら。

www.datacamp.com

基本文法

多次元配列NumPy.ndarrayの作り方

arrayでいちいち指定して作るか、rangeやzerosなどで規則的な配列を作るのが一般的っぽい。
・基本

# 一次元配列
data1 = np.array([1, 2, 3])
# 二次元配列
data2 = np.array([[1, 2, 3], [4, 5, 6]])
# 三次元配列
data3 = np.array([[[1, 2, 3], [4, 5, 6]], [[11, 12, 13], [14, 15, 16]]])

・簡単な作り方

# 要素が全て0の1次元配列
np_zeros = np.zeros(3)
# 要素が全て0の2次元配列
np_zeros = np.zeros((1, 3))
# 要素が全て1の1次元配列
np_ones = np.ones(3)
# 要素の値を指定して(2, 3)の2次元配列
np_full = np.full((2, 3), 5)

# 既存の配列と同じ構造で要素が全て5の配列を新たに作成
data1 = np.array([[1, 2, 3], [4, 5, 6]])
np_full_like = np.full_like(data1, 5)

・その他特徴的な配列の作成

# array([0, 1, 2, 3, 4, 5, 6, 7, 8])
data = np.arange(9)

# array([4, 5, 6, 7])
data = np.arange(4, 8)

# array([2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5])
data = np.arange(2.5, 5.6, 0.5)

# array([2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5])
data = np.linspace(2.5, 5.5, 7)


# 単位行列
# array([[1., 0., 0.],
#      [0., 1., 0.],
#      [0., 0., 1.]])
data = np.eye(3)

・乱数を含む配列

# array([0~1の範囲で乱数 * 10が表示])
data1 = np.random.rand(10)

他にも正規分布でランダムな配列とかもある。

NumPy.ndarrayのプロパティ

プロパティ名 内容
ndim 次元数
shape 各次元の要素数を示すタプル
size 素数
T 転置した時の配列
itemsize 1要素のバイト数
nbytes 多次元配列全体のバイト数

参照の仕方

・インデックス参照
インデックスで触るノリで参照できるよってやつ。インデックス参照で他の変数に配列を代入した場合、その配列は共有することになるので注意。

data = np.arange(6).reshape(2, -1)
# dataは:
#array([[ 0, 1,  2],
#      [ 3,  4,  5]])

data10 = data[0, 1]
data10 = 10

data
# 値を共有しているため、dataは:
# array([[ 0, 10,  2],
#      [ 3,  4,  5]])
# こうなる。

# 回避するには.copy()を使う。
data11 = data[0, 1].copy()
data11 = 11

data
# 相変わらず10のまま:
# array([[ 0, 10,  2],
#      [ 3,  4,  5]])

・ファンシーインデックス参照

data = np.arange(12).reshape((4, -1))
# 二行目、四行目が取れる。
data[[1, 3]]
# 1列目、3列目がとれる
data[:, [0, 2]]
# インデックスがダブってても問題なし
data[:, [2, 0, 2]]

・ブールインデックス参照

data = np.arange(12).reshape((4, -1))
# 1列目、3列目がとれる
data[:, [True, False, True]]

多次元配列の演算とブロードキャスト

このページが分かりやすかった。

deepage.net

ユニバーサル関数

ユニバーサル関数ってのは、配列を引数に与えて、その配列の要素全てに処理を加えられる関数のこと。普通に処理するよりだいぶ早いので、データを処理するときには積極的に使っていきたいところ。

関数名 処理の内容
np.sqrt 平方根
np.floor 切り捨て
np.abs 絶対値
np.log 対数
np.maximum 最大値(nanあればnan)
np.fmax 最大値(nanは無視)

また、ユニバーサル関数は作成できる。 ・作成方法

ユニバーサルな関数名 = np.vectorize(ユニバーサル関数化したい関数)

以上!!!