Python

Python初学者向け:ndarrayの基本操作について解説

スポンサーリンク

 

この記事はこんな方におススメです
  • Pythonを始めたばかりで基本から学びたい方
  • Pythonの基本的な部分を速習してまずは全体像を把握しておきたい方

▶ ndarrayの基本については以下の記事をご覧ください。

はじめに

前回に引き続き、Numpyのndarrayについて扱います。今回はndarrayの形状と次元の変更について基本から解説していきます。ndarrayの形状は各次元ごとの要素数で表します。まずは形状の把握の仕方から始めて、次元の変更までを解説していきます。

ndarrayの基本操作

ndarrayの形状

まずはndarrayの形状はshape属性で確認することができます。

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)
ndarrayの形状

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次元目)です。

np.array([1,2,3])とnp.array([[1,2,3]])の形状は異なる。

初めは見慣れないかもしれませんが、両者の形状は異なります。試しに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」属性で取得できます。

  • 次元数:ndarray.ndim
  • 要素数:ndarray.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)
ndarrayの次元数と要素数

既に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))
ndarrayの形状変更

このようにreshapeのあとで形状を指定すると、要素数が一致する形状であれば変換することができます。1次元配列を作ってreshapeする、というのはよくおこなう操作なので覚えておきましょう。

ndarrayの次元を増やす

次に次元の変更についてみていきましょう。ndarrayはexpand_dimsを使うとsize=1の次元を増やすことができます。

np.expand_dims(ndarray,axis)

第2引数のaxisは次元を追加する位置を指定します。axis=0なら縦方向、axis=1なら横方向、axis=3なら奥行方向です。

array1に対して次元を増やしてみましょう。ここでは2つの方向で試して比較してみましょう。

print(np.expand_dims(array1,axis=0))
print(np.expand_dims(array1,axis=1))
ndarrayの次元を増やす

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の次元を削除する操作となります。

squeeze(ndarray)

試してみましょう。

np.expand_dims(array2,axis=0)
形状(1,3,3)のndarray

これをsqueezeしてみましょう。

np.squeeze(np.expand_dims(array2,axis=0))
形状(3,3)のndarray

このようにsize1の軸が削除されます。

スポンサーリンク

まとめ

今回はndarrayの基本操作を扱いました。簡単にまとめておきましょう。

  • ndarrayの形状はshape属性で取得できる
  • ndarrayの要素数はsize属性で取得できる
  • ndarrayは要素数が同じであればreshapeで形状変更ができる
  • np.expand_dims(ndarray,axis)でsize1の次元を増やせる
  • np.squeeze(ndarray)でsize1の次元を削除できる

コメント

タイトルとURLをコピーしました