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

問題 16 /40

NumPyの次元追加とグリッドデータ生成に関するコードで、正しい結果はどれか。 次の配列が定義されているものとする。 a = np.array([1, 2, 3]) b = np.array([4, 5])

選択 1

a[np.newaxis, :] ▶︎ array([[1], [2], [3]])

選択 2

a[:, np.newaxis] ▶︎ array([[1, 2, 3]])

選択 3

c, d = np.meshgrid(a, b) c ▶︎ array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

選択 4

c, d = np.meshgrid(a, b) d ▶︎ array([[4, 4, 4], [5, 5, 5]])

解説

選択肢4が正解です。 問題文の配列は以下です。 a = np.array([1, 2, 3]) b = np.array([4, 5]) ■ np.newaxis スライス(:)と合わせて使い、次元を追加します。 【選択肢1】 a[np.newaxis, :] ▶︎ array([[1], [2], [3]]) 誤った結果です。 正しい結果は以下です。 ▶︎ array([[1, 2, 3]]) 1次元の配列に対して[np.newaxis, :]とすると、行に「1」が追加されて、(1, 要素数)の形状の2次元になります。選択肢1の変換後の形状は(1, 3)です。 1次元を2次元に変換する場合、選択肢1のようにnp.newaxisを「行」に置いた場合は行に「1」が追加され、選択肢2のようにnp.newaxisを「列」に置いた場合は列に「1」が追加されると覚えます。 【選択肢2】 a[:, np.newaxis] ▶︎ array([[1, 2, 3]]) 誤った結果です。 正しい結果は以下です。 ▶︎ array([[1], [2], [3]]) 1次元の配列に対して[:, np.newaxis]とすると、列に「1」が追加されて、(要素数, 1)の形状の2次元になります。選択肢2の変換後の形状は(3, 1)です。 次元の追加は、要素数が違う配列同士の計算で利用することがあります。また、scikit-learnで学習モデルを作成する際、データを1次元で渡すことができないため、np.newaxisを使って2次元に変換することがあります。 ■ meshgrid meshgridは引数の配列をそれぞれ拡張します。np.newaxisでそれぞれの次元を追加し、お互いを引き伸ばしてブロードキャストすると覚えます。 【選択肢3】 c, d = np.meshgrid(a, b) c ▶︎ array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) 誤った結果です。 正しい結果は以下です。 ▶︎ array([[1, 2, 3], [1, 2, 3]]) 【選択肢4】 c, d = np.meshgrid(a, b) d ▶︎ array([[4, 4, 4], [5, 5, 5]]) 正しい結果です。 meshgridの流れは以下です。 まず、第一引数を[np.newaxis, :]とし、(1, 要素数)の形状に次元追加します。 a = np.array([1, 2, 3]) ▶︎ array([[1, 2, 3]]) 続けて、第二引数を[:, np.newaxis]とし、(要素数, 1)の形状に次元追加します。 b = np.array([4, 5]) ▶︎ array([[4], [5]]) 最後に、お互いの形状に合わせて、お互いを引き伸ばしてブロードキャストします。 array([[1, 2, 3]]) ▶︎ array([[1, 2, 3], [1, 2, 3]]) array([[4], [5]]) ▶︎ array([[4, 4, 4], [5, 5, 5]]) ブロードキャストの詳細は中級問題18で解説しました。 meshgridは、要素数が違う配列同士を計算したり、等高線を描画する際の格子点データとして利用することがあります。 (公式書籍 p.118-120)