データ分析・上級問題チェック
問題 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)