NumPyのshape属性 – 配列の形状の確認と変更

shapeはNumPy配列(ndarray)の属性の1つで配列の形状を保持しています。ここでは、shape属性の確認と変更の方法を解説していきます。

目次

1. shapeで配列の形状を確認/変更

shapeはndarrayの配列の形状を保持しています。これを参照するには、以下のようにndarray.shapeと書きます。

なお、shapeは正確にはnumpy.ndarrayクラスのインスタンス変数です。クラスやインスタンス変数については、『【Python】オブジェクト指向プログラミングの概念と書き方』や『Pythonでのクラス(class)の使い方』で解説していますので、目を通してみてください。

numpy.ndarray.shape

書き方:

ndarray.shape

一緒に確認したい属性と関数:

shapeは、主に配列の現在の形状を取得するために使われますが、配列の形状を変換することにも使うことができます。

早速、実際のコードで確認していきましょう。

1.1. 配列の形状を取得する

shapeは、配列の形状をタプルで保持しています。

例えば、以下のコードでは、まず、3つの要素を持つ1次元配列arr1を生成しています。そして、「arr1.shape」で属性を参照すると(3,)と表示されます。1次元配列は軸が列の1つだけなので、これは列の要素数を表します。

In [1]:
'''  1次元配列のshape属性の値  '''
arr1 = np.array((1, 2, 3))
print(arr1)
print(arr1.shape)
[1 2 3]
(3,)

念のためshape属性のデータ型を確認しておきましょう。以下のようにタプル型であることがわかります。

In [2]:
'''  shape属性の値はタプル型です。  '''
type(arr1.shape)
Out[4]:
tuple

次に2次元配列の場合を見てみましょう。

2次元配列のshape属性は、(行, 列)のタプル型のデータです。以下のコードでは、2行3列の2次元配列を生成しているので、shape属性は(2, 3)です。

In [3]:
'''  2次元配列のshape属性の値  '''
arr2 = np.arange(6).reshape(2, 3)
print(arr2, '\n')
print(arr2.shape)
[[0 1 2]
 [3 4 5]] 

(2, 3)

3次元配列の場合は、(奥行き, 行, 列)のタプルでデータを保持しています。以下のコードでは、奥行き2で、2行3列の配列を生成しているので、shape属性は(2, 2, 3)です。

In [4]:
'''  3次元配列のshape属性の値  '''
arr3 = np.arange(12).reshape(2, 2, 3)
print(arr3, '\n')
print(arr3.shape)
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]] 

(2, 2, 3)

1.2. 配列の形状を変換する

このように、shapeプロパティは、主に配列の現在の形状を取得するために使われますが、これで配列の形状を変換することもできます。

早速、確認していきましょう。

まずは、以下の1次元配列を生成します。

In [1]:
import numpy as np
#  1次元配列を生成
arr1 = np.arange(12)
print(arr1)
[ 0  1  2  3  4  5  6  7  8  9 10 11]

この配列を、shapeプロパティで形状変換するには、「=」演算子で、新しい形状をタプルで渡します。

以下のコードでは2次元配列に変換しています。

In [2]:
# arr1を2次元配列に変換
arr1.shape = (2, 6)
print(arr1)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]

3次元配列以上にも変換することができます。

In [3]:
#  arr1を3次元配列に変換
arr1.shape = (2, 2, 3)
print(arr1)
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]

また「-1」を指定した軸の要素数は、自動で計算してくれます。

In [4]:
#  reshape()と同様に-1指定で自動計算
arr1.shape = (-1, 4)
print(arr1)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

ただし、配列の元々の要素数と、新しく指定する形状が合わない場合はエラーになります。

In [5]:
#  要素数と合わない形状変換は不可
arr1.shape = (2, 4)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-a4ad7f33ccb3> in <module>
      1 #  要素数と合わない形状変換は不可
----> 2 arr1.shape = (2, 4)

ValueError: cannot reshape array of size 12 into shape (2,4)

1.3. ndarrayの属性についての補足

shapeプロパティの使い方に関しては、以上の通りです。

ここからは知識的な補足として、NumPy配列(ndarray)の属性について簡潔に解説しておきたいと思います。

なお解説にあたって、オブジェクト指向プログラミングに不慣れな方は、『Pythonのオブジェクト指向プログラミングの概念と書き方』も一緒にご覧ください。

もし、初めてオブジェクト指向プログラミングに触れるという場合は、最初から全て理解しようとしなくても大丈夫です。NumPy配列の扱いに慣れてきたところで読み返してみると、より理解できるようになっているはずです。

ndarrayは、以下のコードで確認できるように、「numpy.ndarray」クラスです。

In [1]:
import numpy as np
'''  ndarrayはnumpy.ndarrayクラスのインスタンスです。  '''
#  配列の作成
arr = np.arange(4)
#  作成した配列(インスタンス)の出力
print('arr:', arr)
#  作成した配列のクラスの確認
print('arrのクラスの確認:', type(arr))
arr: [0 1 2 3]
arrのクラスの確認: <class 'numpy.ndarray'>

そして、生成したndarrayはnumpy.ndarrayクラスのインスタンスです。インスタンスはインスタンス変数を持ちます。ndarrayの属性とは、このインスタンス変数のことです。

オブジェクト指向プログラミングでは、インスタンス変数は、「インスタンス.プロパティ」で取得することができます。

In [2]:
'''  インスタンスはインスタンス変数を持ちます。 '''
#  インスタンス変数shape
print('shape: ', arr.shape)
#  インスタンス変数ndim
print('ndim: ', arr.ndim)
#   インスタンス変数dtype
print('dtype:', arr.dtype)
shape:  (4,)
ndim:  1
dtype: int64

このようにndarrayの「属性」とは、インスタンス変数のことです。

知っている人にとっては当たり前すぎることかもしれませんが、プログラミング初心者の方は、ぜひ覚えていてください。

2. まとめ

以上。NumPyのshape属性は、配列の形状を保持しているインスタンス変数です。これを使うと、配列の形状を確認することができますし、変更することもできます。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる