[NumPy] 配列の形状変更

[NumPy] 配列の形状変更

配列の形状変更

ndarray.reshape()

 ndarray.reshape()メソッドを使うと、配列の形状を変更することができます。

 ndarray.reshape(shape, order='C')

 shape には新しい配列の行数 m と列数 n を渡します。

# サンプルコード A 配列の形状変更

# NumPyをインポート
import numpy as np

# 1次元配列を生成して3×4に形状変更
x = np.ones(12, dtype = np.int32).reshape(3, 4)

print(x)
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

 引数は並び替え可能な数値を渡す必要があります。すなわち、要素数は m で割り切れて、かつ変更後の配列のインデックスはすべて埋められなければなりません。要素数 11 の 1 次元配列を 3 × 4 の配列に変更しようとしても ValueEroor が発生します。

# 配列の形状変更

# NumPyをインポート
import numpy as np

# 1次元配列を生成して3×4に形状変更
x = np.ones(11, dtype = np.int32).reshape(3, 4)

print(x)
ValueError: cannot reshape array of size 11 into shape (3,4)

 
 元の配列の形状は問われません。形状変更できるかどうかは要素数だけで決まります。サンプルコード A で作成した配列を 2 × 6 の配列に形状変更してみます。

# サンプルコード A-1

# xを2×6の配列に変更
y = x.reshape(2, 6)

print(y)
[[1 1 1 1 1 1]
 [1 1 1 1 1 1]]

 

numpy.newaxisキーワード

 numpy.newaxis キーワードを使って新しい次元を作成して要素をスライシングすることで、配列の形状を変更することもできます。以下のサンプルコード B では、1 次元配列 [1 2 3] に新しい次元を追加して行ベクトルと列ベクトルとよばれる 2 次元配列を生成します。

# サンプルコードB

# NumPyをインポート
import numpy as np

# 1次元配列を定義
x = np.array([1, 2, 3])

# 行ベクトルを作成
y = x[np.newaxis, :]

# 列ベクトルを作成
z = x[:, np.newaxis]

print("行ベクトル\n{}\n".format(y))
print("列ベクトル\n{}".format(z))
行ベクトル
[[1 2 3]]
 
列ベクトル
[[1]
 [2]
 [3]]

 numpy.newaxis は特別なキーワードではなく、None への参照です。
 すなわち、x[np.newaxis, :] は x[None, :] と書き換えても機能します(つまり要素をもたない次元を追加しています)。
 

行と列の削除

numpy.delete()

 numpy.delete() を使うと、指定した行や列を削除することができます。

 numpy.delete(array, object, axis=None)

 第1引数に配列を、第2引数に削除する行または列を指定します。
 第3引数の axis に 0 を指定すると行を、1 を指定すると列を削除します。

#配列xを定義
x = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 配列xの2行目を削除
y = np.delete(x, 1, axis = 0)

# 配列xの3列目を削除
z = np.delete(x, 2, axis = 1)

print(y)
print(z)
[[1 2 3]
[7 8 9]]
 
[[1 2]
[4 5]
[7 8]]

 
 第2引数にリストやタプルなどのイテラブルを渡して、複数の行や列を削除することもできます。

#配列xを定義
x = np.array([[1, 1, 1, 1],
              [2, 2, 2, 2],
              [3, 3, 3, 3],
              [4, 4, 4, 4]])

# 配列xの1行目と3行目を削除
y = np.delete(x, [0, 2], axis = 0)

# 配列xの2列目と4列目を削除
z = np.delete(x, [1, 3], axis = 1)

print(y)
print(z)
[[2 2 2 2]
[4 4 4 4]]
 
[[1 2]
 [2 2]
 [3 3]
 [4 4]]

 
 第3引数を省略すると、対象配列は 1 次元配列に変更され、第2引数で指定したインデックスの要素を削除します。

#配列xを定義
x = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 配列xを1次元配列に変更して4番目の要素を削除
y = np.delete(x, 3)

print(y)
[1 2 3 5 6 7 8 9]