データ分析・上級問題チェック
問題 14 /40
NumPyで次の配列を1次元に変換できないものはどれか。
arr = np.array([[0, 1],
[2, 3]])
選択 1
arr.ravel()
選択 2
arr.flatten()
選択 3
arr.reshape(-1, 1)
選択 4
arr.reshape(-1)
解説
選択肢3が正解です。
問題文で定義した変数は以下です。
arr = np.array([[0, 1],
[2, 3]])
【選択肢1、2】
arr.ravel()、arr.flatten()
ravelとflattenは、多次元配列を1次元配列に変換するメソッドです。問題文の場合は「array([0, 1, 2, 3])」に変換されます。
ravelとflattenは、他の変数に代入したときの動きが異なります。ravelは参照を返し、flattenはコピーを返します。
■ ravel
-------------------------------
a = np.array([[0, 1],
[2, 3]])
b = a.ravel()
b[0] = 4
a
▶︎ array([[4, 1],
[2, 3]])
-------------------------------
変数bを定義する際に「aを参照して1次元に変換する」と定義されるため、bを変更すると参照先のaも変更されます。
■ flatten
-------------------------------
a = np.array([[0, 1],
[2, 3]])
b = a.flatten()
b[0] = 4
a
▶︎ array([[0, 1],
[2, 3]])
-------------------------------
変数bを定義する際に「aをコピーして1次元に変換する」と定義されるため、bを変更してもaには影響がありません。
【選択肢3、4】
arr.reshape(-1, 1)、arr.reshape(-1)
reshapeは配列の形状を変換するメソッドです。例えば「arr = np.array([0, 1, 2, 3, 4, 5])」に対して「arr.reshape(2, 3)」とすると、2行3列の配列に変換されます。
変換前の要素数と変換後の要素数が一致していないとエラーになるため、行数と列数を計算して指定する必要があります。
ここで便利なのが「-1」を使った自動計算です。
「arr.reshape(2, -1)」のように列に「-1」を指定すると、2行に合うように列数が自動計算されます。
「arr.reshape(-1, 3)」のように行に「-1」を指定すると、3列に合うように行数が自動計算されます。
選択肢4のように多次元配列に対して「arr.reshape(-1)」とすると、1次元に変換されます。問題文の場合は「array([0, 1, 2, 3])」に変換されます。
選択肢3の「arr.reshape(-1, 1)」は、1列に合うように行数が自動計算され以下の結果になります。次元数は2のままです。
array([[0],
[1],
[2],
[3]])
なお、reshapeはravelと同じで参照となります。また、公式書籍にreshapeの「-1」を使った実例は登場しません。
(公式書籍 p.94-96、104)