データ分析・上級問題チェック

問題 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)