用語比較
NumPyのビューとコピーの違い|スライスは元の配列と共有、copyは共有しない(Python3データ分析)
NumPyのビューは元の配列と同じデータを見る新しい配列オブジェクトで、コピー(copy メソッド)は配列とデータの完全なコピーなので、元の配列とは何も共有しません。
配列のスライスはビューを返すので、a[:, 1:3] の中身を書き換えると元の a も変わります。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
ビューとコピー(copy メソッド)の要点
ビュー
同じデータを見る新しい配列オブジェクト。c = a.view() の c は a と別のオブジェクトだが、c.base is a は True で、c を変えると a も変わる。スライスもビューを返す。
コピー(copy メソッド)
配列とデータの完全なコピー(deep copy)。d = a.copy() の d は a と何も共有せず、d.base is a は False。d を変えても a は変わらない。
違いを表で確認
| 比較軸 | ビュー | コピー(copy メソッド) |
|---|---|---|
| データの共有 | 元の配列とデータを共有する。ビューの要素を変えると元の配列も変わる | 何も共有しない。コピーを変えても元の配列は変わらない |
| base 属性 | c.base is a は True。c は a が持つデータを見ている | d.base is a は False。d は a と何も共有しない |
| 作り方 | view メソッド、または配列のスライス(a[:, 1:3] など) | copy メソッド(a.copy()) |
| 単なる代入 b = a | ビューでもコピーでもなく、同じ ndarray の別名(b is a は True) | 同じく、関数呼び出しでもコピーは作られない |
Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
スライスに代入したら、元の配列も変わって驚いた人
公式の例では s = a[:, 1:3] のあと s[:] = 10 とすると、a の対応する要素も 10 に変わります。スライスはビューを返すためです。
元の配列を残したまま、一部だけ書き換えたい人
a.copy() で完全なコピーを作ってから書き換えます。コピーは元の配列と何も共有しないので、a は変わりません。
巨大な配列の一部だけを使い続けたい人
公式は、b = a[:100] だと b が a を参照し続けるため、del a をしても a はメモリに残ると説明しています。b = a[:100].copy() にすれば a を解放できます。
具体例で使い分ける
例 1
view メソッドで作ったビューを書き換える
公式の例の3行4列の配列 a から、c = a.view() を作り、c の要素を変えます。
- c is a は False で、c は a と別のオブジェクトです。
- 一方、c.base is a は True で、c は a が持つデータを見ています。
- 公式の例では、c を reshape((2, 6)) して再代入したあとも c は a のビューのままで、c[0, 4] = 1234 とすると a の中身が変わります。
結論: 別のオブジェクトでも、データは共有しています。
例 2
スライスへの代入で元の配列が変わる
公式の例のとおり、s = a[:, 1:3] を作り、s[:] = 10 と代入します。
- 配列のスライスはビューを返すので、s は a のデータを見ています。
- s[:] = 10 で、a の列番号1と2(0始まり)の全行が 10 に変わります。
- 公式は、s = 10 と s[:] = 10 の違いにも注意を促しています。前者は s に別の値を結びつけ直すだけです。
結論: スライスは、コピーではなくビューです。
例 3
copy で作った d を書き換える
公式の例のとおり、d = a.copy() を作り、d[0, 0] = 9999 と代入します。
- d is a は False、d.base is a も False で、d は a と何も共有しません。
- d[0, 0] = 9999 のあとに a を表示しても、a の中身は変わっていません。
結論: copy で作った配列は、書き換えても元の配列に影響しません。
問題文から答えを選ぶ手順
- 1
作り方を見る
view メソッドやスライスならビュー、copy メソッドならコピーです。b = a は別名で、どちらでもありません。
- 2
書き換える対象を見る
ビューを書き換えると元の配列も変わります。コピーを書き換えても元は変わりません。
- 3
base で確かめる
x.base is a が True ならビュー、False ならコピー(または元の配列)です。公式の例では c が True、d が False でした。
試験での見分け方
- 1view メソッドは、同じデータを見る新しい配列オブジェクトを作る。
- 2配列のスライスは、その配列のビューを返す。
- 3copy メソッドは、配列とデータの完全なコピー(deep copy)を作り、元の配列と何も共有しない。
- 4b = a は新しいオブジェクトを作らず、同じ ndarray の別名である。
誤答しやすい選択肢
スライスはコピーが返ると考える
修正: 公式は、配列のスライスはその配列のビューを返すと説明しています。s[:] = 10 のような代入で、元の配列も変わります。
ビューは別のオブジェクトだから、データも別だと考える
修正: view メソッドの c は c is a が False ですが、c.base is a は True で、データは a と共有しています。
b = a でコピーが作られると考える
修正: b = a は同じ ndarray の別名で、b is a は True です。関数呼び出しでもコピーは作られません。
確認問題
Q1配列のスライスが返すのは、ビューとコピーのどちらか?
答え: ビュー
スライスへの代入で、元の配列の対応する要素も変わります。
Q2d = a.copy() のとき、d.base is a の結果は?
答え: False
copy は配列とデータの完全なコピーで、元の配列と何も共有しません。
Q3c = a.view() のとき、c is a と c.base is a の結果は?
答え: c is a は False、c.base is a は True
別のオブジェクトですが、a が持つデータを見ています。
Q4巨大な配列 a の先頭100要素だけを使い続け、a のメモリを解放したいとき、どう書くか?
答え: b = a[:100].copy() としてから del a
b = a[:100] だけだと b が a を参照するため、del a をしても a はメモリに残ります。
到達チェック
- ビューとコピーの違いを、データを共有するかどうかで説明できる
- スライスがビューを返すことを言える
- c.base is a の True と False の意味を答えられる
- b = a が別名であることを区別できる
関連ページで確認する
同じ資格で次に知りたいこと
- NumPy配列とPythonのリストの違い|演算子・要素の型・スライスの結果で比較(Python3データ分析)
NumPyのndarrayとPythonのリストの違いを、要素の型、+ と * の意味、比較演算、スライスの結果(ビューか新しいリストか)で整理します。NumPy公式Quickstartとpython.org公式ドキュメントで照合した例と確認問題つき。
- OOスタイルとpyplotスタイルの違い|Axesを明示するか任せるか(Python3データ分析)
Matplotlibのオブジェクト指向(OO)スタイルとpyplotスタイルの違いを、Figure・Axesの作り方、ラベル設定の書き方、公式の推奨で整理します。公式のQuick start guideで照合した、同じ図を2通りで書く例と確認問題つき。
- scikit-learnの変換器と推定器の違い|transformとpredictの使い分け(Python3データ分析)
scikit-learnの変換器(StandardScalerなど)と推定器(RandomForestClassifierなど)の違いを、transformとpredict、出力、Pipelineでの並びで整理します。scikit-learn公式Getting Startedで照合した例と確認問題つき。
よくある質問
QNumPyのビューとコピーの違いは?
ビューは元の配列と同じデータを見る新しい配列オブジェクトで、書き換えると元の配列も変わります。copy メソッドは配列とデータの完全なコピーで、何も共有しません。
Qスライスはコピーですか?
ビューです。NumPy公式は、配列のスライスはその配列のビューを返すと説明しています。
Qb = a はコピーですか?
コピーではありません。同じ ndarray の別名で、b is a は True です。
Qデータ分析試験の範囲?
本サイトの第3章NumPyの「ビューとコピー」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
