AI資格ドリル
資格を選ぶ

Python3エンジニア認定データ分析試験 第3章 NumPy 予想問題と解説

Python3エンジニア認定データ分析試験「第3章 NumPy」の予想問題を16問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。

この章の要点

ndarrayの属性と作成、演算と軸、ビューとコピーなどを扱う分野です。全16問(基礎3問・標準12問・応用1問)を収録しています。

  • ndarrayの属性と作成
  • 演算と軸
  • ビューとコピー

情報源と編集区分

公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。

試験概要(公式)

確認しておきたいポイント

当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。

  • np.array の引数の渡し方。np.array(1, 2, 3, 4) のように要素を複数の引数で渡すのは公式がよくある誤りとして挙げるもので、np.array([1, 2, 3, 4]) のように1つのシーケンスにまとめて渡す。
  • arange と range の終了値の扱い。np.arange(10, 30, 5) は range と同じく終了の 30 を含まず、array([10, 15, 20, 25]) の4要素になる。
  • shape・ndim・size の取り違え。np.arange(15).reshape(3, 5) では shape が (3, 5)、ndim が軸の数で 2、size が要素の総数で 15 になる。itemsize は配列全体ではなく要素1つぶんのバイト数で、float64 なら 8 である。
  • zeros・ones・empty の違い。zeros は全要素 0、ones は全要素 1、empty は初期値がメモリの状態に依存して不定になる。いずれも dtype の既定は float64 である。
  • axis の向きの取り違え。b.sum(axis=0) は列ごとの合計、axis=1 は行ごとの計算になる。b = np.arange(12).reshape(3, 4) の b.min(axis=1) は array([0, 4, 8]) で、axis=0 なら array([0, 1, 2, 3]) である。
  • 代入・ビュー・コピーの区別。b = a は新しいオブジェクトを作らず別名を付けるだけで b is a が True になる。view は同じデータを見る新しい配列オブジェクトで c is a は False、c.base is a は True になる。スライスもビューを返すので、s[:] = 10 のように代入すると元の配列に反映される。データを共有しないのは copy だけである。
  • reshape と resize の違い。reshape は元の配列を変えずに形を変えた配列を返すので戻り値を受け取る必要があり、ndarray.resize メソッドは戻り値を使わず配列そのものを書き換える。reshape(3, -1) の -1 は結果に残る値ではなく、他の次元から自動計算する指示で、12 個の要素なら (3, 4) になる。

この章に関連する比較記事

混同しやすい2つの概念を並べて整理した記事です。

よくある質問

Q第3章 NumPyは何問収録されていますか?

A

現在16問を収録しています。内訳は基礎3問・標準12問・応用1問です。

Q第3章 NumPyの頻出論点は何ですか?

A

ndarrayの属性と作成、演算と軸、ビューとコピーなどが出題対象です(当サイト収録問題に基づく編集部集計)。

Q間違えた問題はどう復習すればいいですか?

A

誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。

第1問 ・ ndarrayの属性と作成

NumPy の公式ドキュメントにおける ndarray の説明として合っているものはどれか。

  • ア標準ライブラリの array.array と同じクラスで、1次元の配列だけを扱う
  • イ1つの配列に整数と文字列を混在させ、要素ごとに別の型を保持できる
  • ウ同じ型の要素が表のように並んだ多次元配列で、次元は軸(axes)と呼ばれる
  • エshape は要素の総数を表す整数で、ndim は各軸の長さを表すタプルである
答えと解説を見る
ウ同じ型の要素が表のように並んだ多次元配列で、次元は軸(axes)と呼ばれる正解
解説

正解は「同じ型の要素が表のように並んだ多次元配列で、次元は軸(axes)と呼ばれる」である。公式の quickstart は、NumPy の主なオブジェクトを同種の要素(通常は数値)が並ぶ多次元配列とし、次元を軸と呼ぶと説明している。クラス名は ndarray で、別名は array である。ただし標準ライブラリの array.array とは別物で、後者は1次元しか扱えず機能も少ない。shape と ndim は逆に覚えやすく、ndim は軸の数、shape は各軸の長さを並べたタプルである。要素の型は配列全体で1つに揃う点が、Python のリストとの大きな違いである。

NumPy 公式ドキュメント「NumPy quickstart」「The basics」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-014
問題番号 pyda-014 の誤りを報告する
第2問 ・ ndarrayの属性と作成

a = np.arange(15).reshape(3, 5) のとき、a.shape、a.ndim、a.size の組み合わせとして正しいものはどれか。

  • アa.shape は (3, 5)、a.ndim は 2、a.size は 15
  • イa.shape は (5, 3)、a.ndim は 2、a.size は 15
  • ウa.shape は (3, 5)、a.ndim は 15、a.size は 2
  • エa.shape は (15,)、a.ndim は 1、a.size は 15
答えと解説を見る
アa.shape は (3, 5)、a.ndim は 2、a.size は 15正解
解説

正解は「a.shape は (3, 5)、a.ndim は 2、a.size は 15」である。np.arange(15) は 0 から 14 までの15個の要素を並べた1次元配列で、reshape(3, 5) はその要素を3行5列に並べ替える。公式の quickstart は、ndim を軸の数、shape を各軸の長さのタプル、size を要素の総数と説明し、size は shape の各値の積に等しいとしている。したがって shape は (3, 5)、ndim は 2、size は 3×5=15 になる。行と列の順を入れ替えた (5, 3) や、ndim と size の値を取り違えた組み合わせは、属性の意味を取り違えたときの典型的な誤りである。

NumPy 公式ドキュメント「NumPy quickstart」「The basics」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-015
問題番号 pyda-015 の誤りを報告する
第3問 ・ ndarrayの属性と作成

NumPy の公式ドキュメントが「よくある誤り」として挙げる、配列の作り方はどれか。

  • アnp.array([1, 2, 3, 4]) のように、要素を1つのリストにして渡す
  • イnp.array([(1.5, 2, 3), (4, 5, 6)]) のように、タプルを並べたリストを渡して2次元の配列を作る
  • ウnp.array(1, 2, 3, 4) のように、要素を複数の引数として渡す
  • エnp.array([[1, 2], [3, 4]], dtype=np.complex128) のように、dtype を指定して作る
答えと解説を見る
ウnp.array(1, 2, 3, 4) のように、要素を複数の引数として渡す正解
解説

正解は「np.array(1, 2, 3, 4) のように、要素を複数の引数として渡す」である。公式の quickstart は、np.array に要素を複数の引数で渡すのはよくある誤りで、正しくは np.array([1, 2, 3, 4]) のように1つのシーケンスにまとめて渡すと述べている。np.array は要素の列を受け取る引数と dtype などの限られた引数しか持たないため、4つの数を別々に渡すと TypeError になる。また np.array はシーケンスのシーケンスを2次元の配列に変換し、タプルを並べたリストでも同様に作れる。dtype はキーワード引数で指定でき、複素数の配列を作る例も公式に載っている。要素の渡し方と dtype の指定を分けて覚えるとよい。

NumPy 公式ドキュメント「NumPy quickstart」「Array creation」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-016
問題番号 pyda-016 の誤りを報告する
第4問 ・ ndarrayの属性と作成

np.zeros((3, 4)) について、公式ドキュメントの記載に合っているものはどれか。

  • ア3行4列の配列を作るが、初期の中身は不定で、メモリの状態に依存する
  • イ3行4列で全要素が 0 の配列を作り、dtype の既定は int64 である
  • ウ全要素が 0 の配列を作るが、dtype は指定できない
  • エ3行4列で全要素が 0 の配列を作り、dtype の既定は float64 である
答えと解説を見る
エ3行4列で全要素が 0 の配列を作り、dtype の既定は float64 である正解
解説

正解は「3行4列で全要素が 0 の配列を作り、dtype の既定は float64 である」である。公式の quickstart は、要素が未知で大きさだけが分かっている場合に使う関数として zeros(全要素が 0)、ones(全要素が 1)、empty(中身が不定)を挙げ、作られる配列の dtype の既定は float64 だと説明している。empty は初期化の手間を省くため、中身がメモリの状態に依存して不定になり、これが1つ目の選択肢の記述に当たる。zeros でも dtype キーワードで型を指定できる。引数に (3, 4) とタプルで形を渡す点も重要で、3, 4 と2つの引数に分けると別の意味になる。

NumPy 公式ドキュメント「NumPy quickstart」「Array creation」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-017
問題番号 pyda-017 の誤りを報告する
第5問 ・ ndarrayの属性と作成

np.arange(10, 30, 5) の結果はどれか。

  • アarray([10, 15, 20, 25, 30])
  • イarray([10, 15, 20, 25])
  • ウarray([15, 20, 25, 30])
  • エarray([10, 30])
答えと解説を見る
イarray([10, 15, 20, 25])正解
解説

正解は「array([10, 15, 20, 25])」である。公式の quickstart は、arange を組み込みの range に似た関数で、リストの代わりに配列を返すと説明している。np.arange(10, 30, 5) は開始 10、終了 30、刻み幅 5 の指定で、range と同じく終了の値 30 は含まれず、10・15・20・25 の4要素になる。なお公式は、arange に浮動小数点数の刻み幅を使うと有限の精度のため要素数が予測しにくいとして、その場合は要素数を指定できる linspace を使うよう勧めている。終了値を含めたい場合は、終了値を 1 刻み分だけ大きくして指定する。

NumPy 公式ドキュメント「NumPy quickstart」「Array creation」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-018
問題番号 pyda-018 の誤りを報告する
第6問 ・ 演算と軸

A = np.array([[1, 1], [0, 1]])、B = np.array([[2, 0], [3, 4]]) のとき、A * B と A @ B の結果の組み合わせとして正しいものはどれか。

  • アA * B は [[5, 4], [3, 4]]、A @ B は [[2, 0], [0, 4]]
  • イA * B は [[2, 0], [0, 4]]、A @ B は [[5, 4], [3, 4]]
  • ウA * B も A @ B も [[2, 0], [0, 4]]
  • エA * B も A @ B も [[5, 4], [3, 4]]
答えと解説を見る
イA * B は [[2, 0], [0, 4]]、A @ B は [[5, 4], [3, 4]]正解
解説

正解は「A * B は [[2, 0], [0, 4]]、A @ B は [[5, 4], [3, 4]]」である。公式の quickstart は、行列を含む多くの言語と違い、NumPy の積の演算子 * は要素ごとの積で動くと説明している。行列積は @ 演算子(Python 3.5 以降)か dot 関数または dot メソッドで行う。要素ごとの積は同じ位置の値どうしを掛けるので 1×2, 1×0, 0×3, 1×4 で [[2, 0], [0, 4]] になる。行列積は第1行が 1×2+1×3=5 と 1×0+1×4=4、第2行が 0×2+1×3=3 と 0×0+1×4=4 で [[5, 4], [3, 4]] になる。2つの演算の使い分けが出題の要点である。

NumPy 公式ドキュメント「NumPy quickstart」「Basic operations」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-019
問題番号 pyda-019 の誤りを報告する
第7問 ・ 演算と軸

b = np.arange(12).reshape(3, 4) のとき、b.sum(axis=0) の結果はどれか。

  • アarray([6, 22, 38])
  • イ66
  • ウarray([12, 15, 18, 21])
  • エarray([0, 4, 8])
答えと解説を見る
ウarray([12, 15, 18, 21])正解
解説

正解は「array([12, 15, 18, 21])」である。公式の quickstart は、sum や min、max のような集計は既定では配列を数のリストのように扱い全要素に対して計算するが、axis を指定すると配列の指定した軸に沿って計算できると説明している。b.sum(axis=0) は列ごとの合計で、0+4+8=12、1+5+9=15、2+6+10=18、3+7+11=21 となる。axis=1 なら行ごとの合計 [6, 22, 38] になり、axis を指定しなければ全要素の合計 66 になる。axis=0 は各列を縦に足すと覚え、結果の要素数が3行4列のうちの列数 4 になる点で見分ける。

NumPy 公式ドキュメント「NumPy quickstart」「Basic operations」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-020
問題番号 pyda-020 の誤りを報告する
第8問 ・ ビューとコピー

a = np.arange(12).reshape(3, 4) のとき、元の配列 a とデータを共有しない配列を作るのはどれか。

  • アa.copy()
  • イa.view()
  • ウa[:, 1:3]
  • エb = a
答えと解説を見る
アa.copy()正解
解説

正解は「a.copy()」である。公式の quickstart は、配列の演算や操作でデータがコピーされるか否かが初学者の混乱のもとだとして、3つの場合を分けている。1つ目は単なる代入で、b = a は新しいオブジェクトを作らず、同じオブジェクトに別名を付けるだけなので b is a が True になる。2つ目は view メソッドで、同じデータを見る新しい配列オブジェクトを作る。スライスも元の配列のビューを返す。3つ目の copy メソッドだけが配列とそのデータの完全なコピー(ディープコピー)を作り、元の配列とデータを共有しない。データを共有するかどうかが判断の軸である。

NumPy 公式ドキュメント「NumPy quickstart」「Copies and views」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-021
問題番号 pyda-021 の誤りを報告する
第9問 ・ ビューとコピー

a = np.arange(12).reshape(3, 4) に対して s = a[:, 1:3] を実行し、続けて s[:] = 10 を実行した。a について正しいものはどれか。

  • アs は a のコピーなので、a は変わらない
  • イa のすべての要素が 10 に変わる
  • ウビューへの代入はエラーになり、a も s も変わらない
  • エスライスは a のビューなので、a の列番号1と2(0始まり)の全行が 10 に変わる
答えと解説を見る
エスライスは a のビューなので、a の列番号1と2(0始まり)の全行が 10 に変わる正解
解説

正解は「スライスは a のビューなので、a の列番号1と2(0始まり)の全行が 10 に変わる」である。公式の quickstart は、配列をスライスするとそのビューが返るとして、ビューは元の配列と同じデータを見る別の配列オブジェクトだと説明している。したがって s = a[:, 1:3] はコピーではなく、s[:] = 10 と代入すると a の対応する部分にも反映される。変わるのは列番号1と2の全3行ぶんの6要素で、列番号0と3は変わらない。元のデータを守りたいときは、スライスに copy メソッドを付けて独立した配列にしてから代入する。この動作は Python のリストのスライスがコピーを返す点と異なる。

NumPy 公式ドキュメント「NumPy quickstart」「Copies and views」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-022
問題番号 pyda-022 の誤りを報告する
第10問 ・ 演算と軸

12 個の要素を持つ配列 a に対して a.reshape(3, -1) を実行したときの shape はどれか。

  • ア(3, -1)
  • イ(3, 4)
  • ウ(4, 3)
  • エ(12, 3)
答えと解説を見る
イ(3, 4)正解
解説

正解は「(3, 4)」である。公式の quickstart は、reshape の引数の次元の1つに -1 を指定すると、その次元の大きさは他の次元から自動的に計算されると説明している。要素数が 12 の配列を reshape(3, -1) とすると、12÷3=4 が自動で入り shape は (3, 4) になる。-1 は結果の値として残るのではなく、自動計算の指示である。なお reshape は引数の形に変更した配列を返す一方、resize メソッドは配列そのものを変更するという違いも公式に示されている。-1 に使えるのは1つの次元だけで、要素数が割り切れない指定はエラーになる。

NumPy 公式ドキュメント「NumPy quickstart」「Shape manipulation」 https://numpy.org/doc/stable/user/quickstart.html

問題番号: pyda-023
問題番号 pyda-023 の誤りを報告する
第11問 ・ ndarrayの属性と作成

NumPy の公式ドキュメントによると、dtype が float64 の配列で ndarray.itemsize が表す値はどれか。

  • ア1
  • イ4
  • ウ8
  • エ16
答えと解説を見る
ウ8正解
解説

正解は 8 である。公式ドキュメントは、ndarray.itemsize を配列の各要素のバイト数と説明し、float64 の itemsize は 8 であると示している。float64 は 64 ビットの浮動小数点数で、1バイトは 8 ビットなので 8 バイトになる。配列全体のバイト数ではなく要素1つぶんの大きさである点に注意する。1・4・16 は、float64 の itemsize として公式が示す値ではない。dtype を変えれば itemsize も変わるので、dtype とあわせて確認する。

https://numpy.org/doc/stable/user/quickstart.html (NumPy公式ドキュメント「NumPy quickstart」)

問題番号: pyda-039
問題番号 pyda-039 の誤りを報告する
第12問 ・ ndarrayの属性と作成

np.empty で作った配列について、公式ドキュメントの記載に合っているものはどれか。

  • ア要素の初期値が不定で、メモリの状態に依存する
  • イ全要素が 0 になる
  • ウ全要素が 1 になる
  • エ要素を持たない長さ 0 の配列になる
答えと解説を見る
ア要素の初期値が不定で、メモリの状態に依存する正解
解説

正解は、要素の初期値が不定でメモリの状態に依存するという記述である。公式ドキュメントは、np.zeros が全要素 0、np.ones が全要素 1 の配列を作るのに対し、np.empty は初期値がメモリの状態に依存する配列を作ると説明している。初期化の手間を省くぶん、中身は実行のたびに変わりうる。既定の dtype は float64 である。0 や 1 になるのは np.zeros と np.ones であり、np.empty の記載ではない。形(shape)を渡せば、その大きさの配列ができる。

https://numpy.org/doc/stable/user/quickstart.html (NumPy公式ドキュメント「NumPy quickstart」)

問題番号: pyda-040
問題番号 pyda-040 の誤りを報告する
第13問 ・ 演算と軸

b = np.arange(12).reshape(3, 4) のとき、b.min(axis=1) の結果はどれか。

  • アarray([0, 1, 2, 3])
  • イarray([3, 7, 11])
  • ウarray([8, 9, 10, 11])
  • エarray([0, 4, 8])
答えと解説を見る
エarray([0, 4, 8])正解
解説

正解は array([0, 4, 8]) である。公式ドキュメントは、b.min(axis=1) が行ごとの最小値を返すと示している。b は 0 から 3、4 から 7、8 から 11 の3行で、各行の最小値は 0、4、8 になる。axis=0 は列ごとの計算なので、b.min(axis=0) なら array([0, 1, 2, 3]) になる。array([3, 7, 11]) は各行の最大値、array([8, 9, 10, 11]) は列ごとの最大値にあたる。axis の数字が行に沿うか列に沿うかを取り違えないことが要点である。

https://numpy.org/doc/stable/user/quickstart.html (NumPy公式ドキュメント「NumPy quickstart」)

問題番号: pyda-041
問題番号 pyda-041 の誤りを報告する
第14問 ・ 演算と軸

NumPy の reshape と ndarray.resize メソッドの違いとして、公式ドキュメントの記載に合っているものはどれか。

  • アreshape は配列そのものを変更し、resize は形を変えた配列を返す
  • イどちらも元の配列を変更せず、新しい配列を返す
  • ウreshape は形を変えた配列を返し、resize メソッドは配列そのものを変更する
  • エどちらも元の配列そのものを変更する
答えと解説を見る
ウreshape は形を変えた配列を返し、resize メソッドは配列そのものを変更する正解
解説

正解は、reshape が形を変えた配列を返し、resize メソッドは配列そのものを変更するという記述である。公式ドキュメントはこの違いを明記している。reshape は元の配列を変えずに新しい形の配列を返すので、変更を残すには戻り値を受け取る必要がある。一方、resize メソッドは戻り値を使わず、呼び出した配列自体の形を書き換える。reshape と resize の働きを逆にした記述や、両者を同じ動作とする記述は、公式の説明と合わない。

https://numpy.org/doc/stable/user/quickstart.html (NumPy公式ドキュメント「NumPy quickstart」)

問題番号: pyda-042
問題番号 pyda-042 の誤りを報告する
第15問 ・ ビューとコピー

a が ndarray のとき、b = a を実行した直後の説明として、公式ドキュメントの記載に合っているものはどれか。

  • アb is a は False になり、b は a の浅いコピーである
  • イb is a は True になり、b は a の完全なコピー(deep copy)である
  • ウb is a は True になり、b は同じ ndarray の別名である
  • エb is a は False になり、b は a のビューである
答えと解説を見る
ウb is a は True になり、b は同じ ndarray の別名である正解
解説

正解は、b is a が True になり b は同じ ndarray の別名であるという説明である。公式ドキュメントは、単純な代入は新しいオブジェクトを作らず、同じ ndarray に別の名前を付けるだけだと述べている。そのため、b を通じて変更すれば a にも同じ変更が見える。関数呼び出しでもコピーは作られない。ビューを作るのは view メソッドやスライス、完全なコピーを作るのは copy メソッドであり、代入ではそのどちらも起きない。

https://numpy.org/doc/stable/user/quickstart.html (NumPy公式ドキュメント「NumPy quickstart」)

問題番号: pyda-043
問題番号 pyda-043 の誤りを報告する
第16問 ・ ビューとコピー

a が ndarray のとき、c = a.view() を実行した後の c is a と c.base is a の組み合わせとして、公式ドキュメントの記載に合っているものはどれか。

  • アc is a は False、c.base is a は True
  • イc is a は True、c.base is a は True
  • ウc is a は False、c.base is a は False
  • エc is a は True、c.base is a は False
答えと解説を見る
アc is a は False、c.base is a は True正解
解説

正解は、c is a が False、c.base is a が True の組である。公式ドキュメントは、view メソッドが同じデータを見る新しい配列オブジェクトを作ると説明している。新しいオブジェクトなので c is a は False になり、c.base が元の配列 a を指すので c.base is a は True になる。データは共有されるため、c の要素を変えると a のデータも変わる。a と c は別のオブジェクトだが、データは同じである点が要点である。

https://numpy.org/doc/stable/user/quickstart.html (NumPy公式ドキュメント「NumPy quickstart」)

問題番号: pyda-044
問題番号 pyda-044 の誤りを報告する

執筆: AI資格ドリル編集部(運営者情報を見る)