▶ ndarrayの基本については以下の記事をご覧ください。
はじめに
前回に引き続き、Numpyのndarrayについて扱います。今回はndarrayの形状と次元の変更について基本から解説していきます。ndarrayの形状は各次元ごとの要素数で表します。まずは形状の把握の仕方から始めて、次元の変更までを解説していきます。
ndarrayの基本操作
ndarrayの形状
まずはndarrayの形状はshape属性で確認することができます。
ndarrayのshapeは各次元ごとの要素数で形状をタプルで表します。実際にいくつか見てみましょう。
import numpy as np
array1 = np.array([1,2,3])
array2 = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
array3 = np.array([[[1,2,3,4,5],
[4,5,6,7,8]],
[[7,8,9,10,11],
[10,11,12,13,14]],
[[13,14,15,16,17],
[16,17,18,19,20]]])
print(array1.shape)
print(array2.shape)
print(array3.shape)
array1は1次元でベクトルですね。shapeをみると(3, )という見慣れない表記ですが、要素が1つのタプルはこのような表記になります。3つの要素がある1次元の配列という意味になります。
array2は2次元で行列です。shapeをみると(3,3)なので3行3列の行列です。最初の数字が縦方向(2次元目)、2番目の数字が横方向(1次元目)です。
array3は3次元配列です。shapeをみると(3,2,5)です。最初の数字が奥行方向(3次元目)、2番目の数字が縦方向(2次元目)、3番目の数字が横方向(1次元目)です。
初めは見慣れないかもしれませんが、両者の形状は異なります。試しにshapeをみてみましょう。
print('np.array([1,2,3])の形状は{}です'.format(np.array([1,2,3]).shape))
print('np.array([[1,2,3]])の形状は{}です'.format(np.array([[1,2,3]]).shape))
np.array([1,2,3])は1次元でベクトルですね。形状をみると(3, )となっていますね。一方、np.array([[1,2,3]])は2次元で行列です。形状をみると(1,3)となっています。今後、ndarrayの演算をするにあたって、形状の把握は重要となるのでしっかりおさえておきましょう。
ndarrayの次元と要素の数
ndarrayの形状でも次元はわかるのですが、次元数そのものを取得するには「ndim」属性にアクセスします。また、要素の数は「size」属性で取得できます。
先ほどのarray1, array2, array3で試しておきましょう。
print('*'*50)
print(array1)
print('array1の次元数は{}、要素数は{}です'.format(array1.ndim,array1.size))
print('*'*50)
print()
print('*'*50)
print(array2)
print('array2の次元数は{}、要素数は{}です'.format(array2.ndim,array2.size))
print('*'*50)
print()
print('*'*50)
print(array3)
print('array3の次元数は{}、要素数は{}です'.format(array3.ndim,array3.size))
print('*'*50)
既にarray1, array2, array3はshapeで形状を確認していますね。array1は1次元配列、array2は2次元配列、array3は3次元配列でした。array1の次元は1、array2は2次元配列なので次元は2、array3は3次元配列なので次元は3となります。それぞれの要素数は文字通り「要素の数」なのでarray1では3、array2では9、array3では30となります。
ndarrayの形状変更
reshapeを使うことでndarrayの形状を変えることができます。reshapeにより形状変更する際には変更前後で要素数が一致している必要があります。
array3で試してみましょう。array3の形状は(3,2,5)で要素数は30です。
array3_changed = array3.reshape(5,6)
print('array3の変更前の形状は{}で、要素数は{}です'.format(array3.shape,array3.size))
print('array3の変更前の形状は{}で、要素数は{}です'.format(array3_changed.shape,array3_changed.size))
このようにreshapeのあとで形状を指定すると、要素数が一致する形状であれば変換することができます。1次元配列を作ってreshapeする、というのはよくおこなう操作なので覚えておきましょう。
ndarrayの次元を増やす
次に次元の変更についてみていきましょう。ndarrayはexpand_dimsを使うとsize=1の次元を増やすことができます。
第2引数のaxisは次元を追加する位置を指定します。axis=0なら縦方向、axis=1なら横方向、axis=3なら奥行方向です。
array1に対して次元を増やしてみましょう。ここでは2つの方向で試して比較してみましょう。
print(np.expand_dims(array1,axis=0))
print(np.expand_dims(array1,axis=1))
array([1,2,3])に対してaxis=0は行方向に次元を増やしています。そのため、もともと要素数3の一次元配列だったものが1行3列の行列(2次元配列)になります。
array([1,2,3])に対してaxis=1は列方向に次元を増やしています。そのため、もともと要素数3の一次元配列だったものが3行1列の行列(2次元配列)になります。
axisに関しては行方向、列方向と考えるよりも次元を増やす位置のインデクスと考えたほうがわかりやすいかもしれませんね。
もともと(3,)の形状のものをaxis=0とすると、インデクス0の位置の次元を増やして(1,3)という形状になる。axis=1とすると、インデクス1の位置の次元を増やして(3,1)という形状になる、というわけです。
ndarrayの次元を減らす
今度は次元を減らす、という逆の操作です。これはsqueezeを使います。このsqueezeはsizeが1の次元を削除する操作となります。
試してみましょう。
np.expand_dims(array2,axis=0)
これをsqueezeしてみましょう。
np.squeeze(np.expand_dims(array2,axis=0))
このようにsize1の軸が削除されます。
まとめ
今回はndarrayの基本操作を扱いました。簡単にまとめておきましょう。
コメント