[NumPy] 配列の形状変更

[NumPy] 配列の形状変更

配列の形状変更

ndarray.reshape()

 ndarray.reshape() を使うと、配列の形状を変更 できます。

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

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

# リストRS01-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 が発生します。

# リストRS01-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 の配列に形状変更してみます。

# リストRS01-3

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

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

 

ビジネスPython超入門

新品価格
¥2,592から
(2019/8/21 23:35時点)

ndarray.resize()

 ndarray.resize() は配列の形状を変更します。変更された配列がもとの配列より大きければ、必要なだけ 0 で埋められます。

# リストRS02-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]]

 新しい配列がもとの配列より小さければ、余った要素は捨てられます。

# リストRS02-2

# xの形状を2×2に変更
x.resize(2, 2)

print(x)
[[1 2]
 [3 4]]

 

numpy.reshape()

 numpy.reshape() は配列の形状を変更します。

 numpy.reshape(a, newshape, order='C')

 a:配列に相当するオブジェクト
 new_shape:整数または整数のタプル
 order:{'C', 'F', 'A'}
# リストRS03

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() は配列の形状を変更します。

 numpy.resize(a, new_shape)
 a:配列に相当するオブジェクト
 new_shape:整数または整数のタプル

 新しい配列がもとの配列 a より大きければ、必要なだけ a の要素を繰り返して埋めます。

# リストRS04-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 よりも小さければ、余った要素は捨てられます。

# リストRS04-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 次元配列を生成します。

# リストRS05

# 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, :] と書き換えても機能します(つまり要素をもたない次元を追加しています)。