Python – 2-2.numpy –

ndarrayの変形(reshape)

2次元を1次元に変換(2×3 -> 6)

nary = np.ones((2,3))
==> array([[1., 1., 1.],
           [1., 1., 1.]])
nary = nary.reshape(6)
==> array([1., 1., 1., 1., 1., 1.])
※要素数が一致していないとエラー
nary = nary.reshape(5)
==> ValueError: cannot reshape array of size 6 into shape (5,)

1次元を2次元に変換(6 -> 3×2)

nary = nary.reshape((3,2))
array([[1., 1.],
       [1., 1.],
       [1., 1.]])

ravel()関数での一次元化(2×3 -> 6)

nary = np.ones((2,3))
nary = np.ravel(nary)
==> array([1., 1., 1., 1., 1., 1.])

ravel()メソッドでの一次元化(2×3 -> 6)

nary = np.ones((2,3))
nary = nary.ravel()
==> array([1., 1., 1., 1., 1., 1.])

flatten()メソッドでの一次元化(2×3 -> 6)

nary = np.ones((2,3))
nary = nary.flatten()
==> array([1., 1., 1., 1., 1., 1.])

要素(単一・行・列)の追加

要素の追加(append)

単一要素の追加

nary = np.ones((2,3))
==> array([[1., 1., 1.],
           [1., 1., 1.]])
np.append(nary, 9)
==> array([1., 1., 1., 1., 1., 1., 9.])
※1次元に変換後に追加される。

行の追加

np.append(nary, np.full(3, 999).reshape(1,3), axis=0)
==> array([[  1.,   1.,   1.],
           [  1.,   1.,   1.],
           [999., 999., 999.]])
※3x2の配列の場合は、reshape(1,3)で1行の配列に変換してからaxis=0でappend

列の追加

np.append(nary, np.full(2, 999).reshape(2,1), axis=1)
==> array([[  1.,   1.,   1., 999.],
           [  1.,   1.,   1., 999.]])
※3x2の配列の場合は、reshape(2,1)で1列の配列に変換してからaxis=1でappend
追加するndarryの型とaxisがマッチしていない場合はエラー
np.append(nary, np.full(2, 999).reshape(2,1), axis=0)
==> ValueError: all the input array dimensions except for the concatenation axis must match exactly

要素の追加(insert)

単一要素の追加

nary = np.ones((2,3))
np.insert(nary, 2, 9)
==> array([1., 1., 9., 1., 1., 1., 1.])
※1次元に変換後に追加される。

行の追加

np.insert(nary, 1, np.full(3, 999).reshape(1,3), axis=0)
==> array([[  1.,   1.,   1.],
           [999., 999., 999.],
           [  1.,   1.,   1.]])
※3x2の配列の場合は、reshape(1,3)で1行の配列に変換してからaxis=0でappend

列の追加

np.insert(nary, 1, 999, axis=1)
==> array([[  1., 999.,   1.,   1.],
           [  1., 999.,   1.,   1.]])
※3x2の配列の場合は、reshape(2,1)で1列の配列に変換してからaxis=1でappend
※ 挿入値はappendと異なり、スカラ値でもリストでもndarrayでも可。以下も同じ結果となる。
np.insert(nary, 1, [999], axis=1)
np.insert(nary, 1, np.full(1, 999), axis=1)
追加するndarryの型とaxisがマッチしていない場合はエラー
np.append(nary, np.full(2, 999).reshape(2,1), axis=0)
==> ValueError: all the input array dimensions except for the concatenation axis must match exactly

2次元ndarrayを指定行に挿入

np.insert(nary, 1, np.full(6, 999).reshape(2,3), axis=0)
==> array([[  1.,   1.,   1.],
           [999., 999., 999.],
           [999., 999., 999.],
           [  1.,   1.,   1.]])
※列数が合っていれば1次元と同様に挿入できる

挿入先を複数指定して挿入

nary = np.ones((2,3))
※先頭行の前と、1行目の後
np.insert(nary, [0,1], np.full(3, 999).reshape(1,3), axis=0)
==> array([[999., 999., 999.],
           [  1.,   1.,   1.],
           [999., 999., 999.],
           [  1.,   1.,   1.]])
※1行目の後と2行目の後(この場合は最終行)
np.insert(nary, [1,2], np.full(3, 999).reshape(1,3), axis=0)
==> array([[  1.,   1.,   1.],
           [999., 999., 999.],
           [  1.,   1.,   1.],
           [999., 999., 999.]])

ndarrayの結合

nary1 = np.ones((2,3))
nary2 = np.full((2,3), 9)

列の追加・結合(hstack)

nary = np.ones((2,3))
np.hstack((nary, np.full(2, 999).reshape(2,1)))
==> array([[  1.,   1.,   1., 999.],
           [  1.,   1.,   1., 999.]])
※引数は1つ。2つの配列はタプルで指定する

行の追加・結合(vstack)

nary = np.ones((2,3))
np.vstack((nary, np.full(3, 999.0).reshape(1,3)))
==> array([[  1.,   1.,   1.],
           [  1.,   1.,   1.],
           [999., 999., 999.]])
※引数は1つ。2つの配列はタプルで指定する

複数のndarrayの結合(concatenate)

デフォルトでは縦方向の結合(axis=0)。結合するndarrayはリストで指定する
np.concatenate([nary1, nary2])
==> array([[1., 1., 1.],
           [1., 1., 1.],
           [9., 9., 9.],
           [9., 9., 9.]])
3つ以上のndarrayの結合も可能
np.concatenate([nary1, nary2, np.zeros((1,3))])
==> array([[1., 1., 1.],
           [1., 1., 1.],
           [9., 9., 9.],
           [9., 9., 9.],
           [0., 0., 0.]])
axisで縦方向の結合も可能
np.concatenate([nary1, nary2], axis=1)
==> array([[1., 1., 1., 9., 9., 9.],
           [1., 1., 1., 9., 9., 9.]])

新しい軸を追加しての結合(stack)

np.stack([nary1, nary2])
==> array([[[1., 1., 1.],
            [1., 1., 1.]],
           [[9., 9., 9.],
            [9., 9., 9.]]])
※2次元配列を2つ重ねた3次元配列となる
※引数となる2つのndarrayはリストで指定する
np.stack([nary1, nary2], axis=1)
==> array([[[1., 1., 1.],
            [9., 9., 9.]],
           [[1., 1., 1.],
            [9., 9., 9.]]])
※更に軸を変換してのstack
np.stack([nary1, nary2], axis=2)
==> array([[[1., 9.],
            [1., 9.],
            [1., 9.]],
           [[1., 9.],
            [1., 9.],
            [1., 9.]]])

引数の指定方法で結合順が変わる(block)

横方向での結合
np.block([nary1, nary2])
==> array([[1., 1., 1., 9., 9., 9.],
           [1., 1., 1., 9., 9., 9.]])
縦方向への結合
np.block([[nary1], [nary2]])
==> array([[1., 1., 1.],
           [1., 1., 1.],
           [9., 9., 9.],
           [9., 9., 9.]])
このような結合も可能(横に結語してから縦結合。列・行の数が合っていれば)
np.block([[nary1, nary2], [np.zeros(6)]])
==> array([[1., 1., 1., 9., 9., 9.],
           [1., 1., 1., 9., 9., 9.],
           [0., 0., 0., 0., 0., 0.]])

2021-12-15

Posted by tfurukaw