配列の形状変更
ndarray.reshape()
ndarray.reshape() を使うと、配列の形状を変更 できます。
shape には新しい配列の行数 m と列数 n を渡します。
# PYTHON_NUMPY_ARRAY_RESHAPE-1
# 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 が発生します。
# PYTHON_NUMPY_ARRAY_RESHAPE-2
# 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)
元の配列の形状は問われません。形状変更できるかどうかは要素数だけで決まります。
リストRS01-1 で作成した配列を 2 × 6 の配列に形状変更してみます。
# PYTHON_NUMPY_ARRAY_RESHAPE-3
# xを2×6の配列に変更
y = x.reshape(2, 6)
print(y)
[[1 1 1 1 1 1] [1 1 1 1 1 1]]
![]() |

ndarray.resize()
ndarray.resize() は配列の形状を変更します。変更された配列がもとの配列より大きければ、必要なだけ 0 で埋められます。
# PYTHON_NUMPY_ARRAY_RESIZE-1
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6]])
# xの形状を3×4に変更
x.resize(3, 4)
print(x)
[[1 2 3 4] [5 6 0 0] [0 0 0 0]]
新しい配列がもとの配列より小さければ、余った要素は捨てられます。
# PYTHON_NUMPY_ARRAY_RESIZE-2
# xの形状を2×2に変更
x.resize(2, 2)
print(x)
[[1 2] [3 4]]
numpy.reshape()
numpy.reshape() は配列の形状を変更します。
# PYTHON_NUMPY_RESHAPE
import numpy as np
# 2×3の配列を定義
x = np.array([[1, 2, 3],
[4, 5, 6]])
# xの形状を2×3に変更
y = np.reshape(x, (2, 3))
print(y)
[[1 2 3] [4 5 6]]
もとの配列 a と新しい配列の要素数が一致していなければエラーを返します。
numpy.resize()
numpy.resize() は配列の形状を変更します。
新しい配列がもとの配列 a より大きければ、必要なだけ a の要素を繰り返して埋めます。
# PYTHON_NUMPY_RESIZE-1
import numpy as np
# 2×2の配列を定義
x = np.array([[1, 2],
[3, 4]])
# xの形状を3×3に変更
y = np.resize(x, (3, 3))
print(y)
[[1 2 3] [4 1 2] [3 4 1]]
新しい配列がもとの配列 a よりも小さければ、余った要素は捨てられます。
# PYTHON_NUMPY_RESIZE-2
# yの形状を1×6に変更
z = np.resize(y, (1, 6))
print(z)
[[1 2 3 4 1 2]]
numpy.newaxisキーワード
numpy.newaxis キーワードを使って新しい次元を作成して要素をスライシングすることで、配列の形状を変更することもできます。以下のサンプルコード B では、1 次元配列 [1 2 3] に新しい次元を追加して行ベクトルと列ベクトルとよばれる 2 次元配列を生成します。
# PYTHON_NUMPY_NEWAXIS
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, :] と書き換えても機能します(つまり要素をもたない次元を追加しています)。
コメントを書く