用語比較
NumPy配列とPythonのリストの違い|演算子・要素の型・スライスの結果で比較(Python3データ分析)
NumPyの配列(ndarray)はすべて同じ型の要素が並ぶ配列で、算術演算子は要素ごとに働きます。Pythonのリストは異なる型の要素を含められ、+ は連結、* は繰り返しになります。
同じ [1, 2, 3] を元にしても、2倍にすると結果が変わります。リストは [1, 2, 3, 1, 2, 3]、ndarrayは array([2, 4, 6]) です。スライスも、リストは新しいリスト、ndarrayは元の配列のビューを返します。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
NumPyのndarrayとPythonのリストの要点
NumPyのndarray
同種の多次元配列で、すべて同じ型の要素が並ぶ。算術演算子は要素ごとに働き、新しい配列を作る。スライスは元の配列のビューを返す。
Pythonのリスト
コンマ区切りの値を角括弧で囲んで書く複合データ型で、異なる型の要素を含められる。+ は連結、* は繰り返し。スライスは新しいリストを返す。
違いを表で確認
| 比較軸 | NumPyのndarray | Pythonのリスト |
|---|---|---|
| 要素の型 | すべて同じ型(同種の配列)。型は dtype で確かめる | 異なる型の要素を含められる |
| a + b | 要素ごとの和の新しい配列。[1, 2] と [3, 4] から作った配列どうしなら array([4, 6]) | 連結。[1, 2] + [3, 4] は [1, 2, 3, 4] |
| a * 2 | 要素ごとの積。array([1, 2, 3]) * 2 は array([2, 4, 6])。配列どうしの * も要素ごとの積で、行列積は @ か dot | 繰り返し(自分自身を n 回足すのと同じ)。[1, 2, 3] * 2 は [1, 2, 3, 1, 2, 3] |
| 比較演算(a < 35) | 要素ごとに比べた真偽値の配列。array([20, 30, 40, 50]) < 35 は array([True, True, False, False]) | 要素ごとの真偽値の並びにはならない。要素ごとに調べるならリスト内包表記などを使う |
| スライス | 元の配列のビューを返す。スライスへの代入で元の配列も変わる | 新しいリストを返す。スライスを変えても元のリストは変わらない |
| 次元 | 多次元配列で、軸(axes)ごとに shape で大きさを表す | 入れ子のリストで2次元を表せるが、shape や ndim といった属性は持たない |
Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
リストに * 2 をして、数値が2倍にならなかった人
リストの * は繰り返しなので、[1, 2, 3] * 2 は [1, 2, 3, 1, 2, 3] になります。各要素を2倍にしたいなら、np.array([1, 2, 3]) * 2 で array([2, 4, 6]) を得るか、リスト内包表記で書きます。
スライスを書き換えて、元のデータまで変わった人
NumPyのスライスはビューなので、s = a[1:3] のあと s[0] = 99 とすると a も変わります。リストのスライスは新しいリストなので、同じ操作でも元のリストは変わりません。元の配列を残したいときは a[1:3].copy() を使います。
異なる型の値が混ざったデータを扱いたい人
文字列と数値が混ざる並びは、リストなら要素の型を問わず入れられます。ndarray はすべて同じ型の要素が並ぶ配列なので、数値を要素ごとに計算する場面に向きます。
具体例で使い分ける
例 1
同じ + でも、リストは連結・配列は要素ごとの和
[1, 2] と [3, 4] を、リストのまま + で足す場合と、np.array にして + で足す場合を比べます。
- リストの + は連結で、[1, 2] + [3, 4] は [4, 6] ではなく [1, 2, 3, 4] です。要素の数は4つに増えます。
- ndarray の算術演算子は要素ごとに働き、新しい配列を作ります。np.array([1, 2]) + np.array([3, 4]) は array([4, 6]) で、要素の数は2つのままです。
結論: リストの + は並びを延ばす操作、ndarray の + は同じ位置の要素どうしの計算です。
例 2
* の結果を、リストと配列で比べる
[1, 2, 3] を元に、リストと ndarray のそれぞれに * 2 を行います。
- リストの s * n は、s を自分自身に n 回足すのと同じです。[1, 2, 3] * 2 は [1, 2, 3, 1, 2, 3] で、6要素になります。
- ndarray の * は要素ごとの積です。np.array([1, 2, 3]) * 2 は array([2, 4, 6]) で、3要素のままです。
- 配列どうしの * も要素ごとの積で、行列積は @ 演算子か dot で行います。公式の例では、A=[[1,1],[0,1]]、B=[[2,0],[3,4]] のとき A*B は [[2,0],[0,4]]、A@B は [[5,4],[3,4]] です。
結論: 数値を要素ごとに計算したいときの * は、ndarray で書きます。
例 3
スライスへの代入で、元が変わるかを比べる
[0, 1, 2, 3] のリストと np.array([0, 1, 2, 3]) の両方で、1番目から3番目の手前までをスライスし、先頭の要素を 99 にします。
- リストでは、スライスは新しいリストを返すので、s = lst[1:3] の s[0] = 99 をしても lst は [0, 1, 2, 3] のままです。
- ndarray では、スライスは元の配列のビューを返すので、s = a[1:3] の s[0] = 99 のあと、a は array([0, 99, 2, 3]) に変わります。
結論: スライスの結果は、リストなら新しいリスト、ndarray ならビューです。
問題文から答えを選ぶ手順
- 1
何の演算かを確認する
+ や * が出てきたら、左辺がリストか ndarray かを確認します。リストなら連結・繰り返し、ndarray なら要素ごとの演算です。
- 2
要素の型を確認する
型が混ざっているならリスト、すべて同じ型の数値の並びなら ndarray が向きます。ndarray の型は dtype で確かめます。
- 3
スライス後の書き換えを確認する
元のデータが変わるかを聞かれたら、ndarray ならビューなので変わる、リストなら新しいリストなので変わらない、と答えます。
試験での見分け方
- 1ndarray は同種の多次元配列で、すべて同じ型の要素が並ぶ。リストは異なる型の要素を含められる。
- 2ndarray の算術演算子は要素ごとに働き、新しい配列を作る。* も要素ごとの積で、行列積は @ か dot。
- 3リストの + は連結、s * n は s を自分自身に n 回足すのと同じ。
- 4ndarray のスライスはビュー、リストのスライスは新しいリストを返す。
誤答しやすい選択肢
リストの * 2 で各要素が2倍になると考える
修正: リストの * は繰り返しです。[1, 2, 3] * 2 は [1, 2, 3, 1, 2, 3] になります。要素ごとの2倍は ndarray で行います。
ndarray の * を行列積だと考える
修正: NumPy公式は、多くの行列言語と違い * は要素ごとの積で、行列積は @ か dot で行うと説明しています。
ndarray のスライスもリストと同じく別のデータになり、元は変わらないと考える
修正: ndarray のスライスは元の配列のビューを返し、データを共有します。スライスへの代入で元の配列も変わります。新しいリストを返すのはリストのスライスです。
確認問題
Q1[1, 2] + [3, 4] の結果は?
答え: [1, 2, 3, 4]
リストの + は連結です。要素ごとの和にはなりません。
Q2np.array([1, 2]) + np.array([3, 4]) の結果は?
答え: array([4, 6])
ndarray の算術演算子は要素ごとに働き、新しい配列を作ります。
Q3[1, 2, 3] * 2 の結果は?
答え: [1, 2, 3, 1, 2, 3]
リストの s * n は、s を自分自身に n 回足すのと同じです。
Q4a = np.array([0, 1, 2, 3]) で s = a[1:3] とし、s[0] = 99 としたあとの a は?
答え: array([0, 99, 2, 3])
ndarray のスライスはビューを返すので、スライスへの代入で元の配列も変わります。
到達チェック
- ndarray とリストの要素の型の違いを言える
- + と * の結果が、リストと ndarray で違うことを説明できる
- ndarray の * が要素ごとの積で、行列積は @ か dot だと答えられる
- スライスの結果がリストと ndarray で違うことを区別できる
関連ページで確認する
同じ資格で次に知りたいこと
- scikit-learnの変換器と推定器の違い|transformとpredictの使い分け(Python3データ分析)
scikit-learnの変換器(StandardScalerなど)と推定器(RandomForestClassifierなど)の違いを、transformとpredict、出力、Pipelineでの並びで整理します。scikit-learn公式Getting Startedで照合した例と確認問題つき。
- fit_transformとtransformの違い|テストデータにfitしない理由(Python3データ分析)
scikit-learnのfit_transformとtransformの違いを、学習用とテスト用の使い分け、データリーク、Pipelineで整理します。scikit-learn公式で照合した例と確認問題つき。
- OOスタイルとpyplotスタイルの違い|Axesを明示するか任せるか(Python3データ分析)
Matplotlibのオブジェクト指向(OO)スタイルとpyplotスタイルの違いを、Figure・Axesの作り方、ラベル設定の書き方、公式の推奨で整理します。公式のQuick start guideで照合した、同じ図を2通りで書く例と確認問題つき。
よくある質問
QNumPy配列とリストの違いは?
ndarray は同じ型の要素が並ぶ配列で、算術演算子が要素ごとに働きます。リストは異なる型の要素を含められ、+ は連結、* は繰り返しになります。スライスも、ndarray はビュー、リストは新しいリストを返します。
Qリストに * 2 をするとどうなりますか?
各要素が2倍になるのではなく、リストが2回繰り返されます。[1, 2, 3] * 2 は [1, 2, 3, 1, 2, 3] です。
Qndarray のスライスはコピーですか?
コピーではなくビューです。NumPy公式は、配列のスライスはその配列のビューを返すと説明しています。
Qデータ分析試験の範囲?
本サイトの第3章NumPyの「ndarrayの属性と作成」「演算と軸」「ビューとコピー」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
