AI資格ドリル
資格を選ぶ

用語比較

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

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

スライスに代入したら、元の配列も変わって驚いた人

公式の例では s = a[:, 1:3] のあと s[:] = 10 とすると、a の対応する要素も 10 に変わります。スライスはビューを返すためです。

02

元の配列を残したまま、一部だけ書き換えたい人

a.copy() で完全なコピーを作ってから書き換えます。コピーは元の配列と何も共有しないので、a は変わりません。

03

巨大な配列の一部だけを使い続けたい人

公式は、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. 1

    作り方を見る

    view メソッドやスライスならビュー、copy メソッドならコピーです。b = a は別名で、どちらでもありません。

  2. 2

    書き換える対象を見る

    ビューを書き換えると元の配列も変わります。コピーを書き換えても元は変わりません。

  3. 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 が別名であることを区別できる

同じ資格で次に知りたいこと

よくある質問

QNumPyのビューとコピーの違いは?

A

ビューは元の配列と同じデータを見る新しい配列オブジェクトで、書き換えると元の配列も変わります。copy メソッドは配列とデータの完全なコピーで、何も共有しません。

Qスライスはコピーですか?

A

ビューです。NumPy公式は、配列のスライスはその配列のビューを返すと説明しています。

Qb = a はコピーですか?

A

コピーではありません。同じ ndarray の別名で、b is a は True です。

Qデータ分析試験の範囲?

A

本サイトの第3章NumPyの「ビューとコピー」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。

次に見る比較

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