レッスン1 / 1問目

『view()とcopy()』

このレッスンでは配列の複製について学習していきましょう。配列の複製を学習するにあたり以下について見ていきます。(本レッスンはメモリの知識が必要となります。)

  • スライスは元の配列を参照する
  • ビューとコピー
  • copy()
  • view()

スライスは元の配列を参照する

まずはスライスが元の配列を参照していることについて見ていきます。
配列の参照方法には以下に挙げる4つがありました。

  1. インデックス参照
  2. スライス
  3. ブールインデックス参照
  4. ファンシーインデックス参照

この中のスライスについてですが、スライスは他の参照方法と異なり元の配列のメモリを参照します。そのためスライスで取得した配列に対して変更を加えると元の配列に対しても変更が加えられます。

以下の例では配列arr2は配列arr1の要素をスライスにより取得しています。

  1. arr1 = np.array([1, 2, 3])
  2. arr2 = arr1[0:1]
  3. print(arr2)
[1]    # スライスにより取得

そして、以下のようにarr2に対して100を代入すると元配列であるarr1の値も書き換えられていることがわかります。

  1. arr2[0] = 100    # arr2の要素に対して100を代入
  2. print(arr2)
  3. print(arr1)
[100] [100 2 3]    # 元の配列の要素も書き換えられる。

このようにスライスは元の配列のメモリを参照しているため要素を変更するとその変更内容が元の配列にも反映されます。

ちなみに配列におけるスライスは元配列のメモリを参照しますが、リストにおけるスライスは元のリストから複製された配列となります。

ビューとコピー

上記のように元の配列のメモリを参照することをビューと呼びます。
それとは対称に元配列と同じ要素を持つ配列を複製することをコピーといいます。

上記で見たようにビューの場合は配列に変更を加えた際に元の配列に対しても変更が反映されるため、予期せず元配列が変更されるリスクがあります。一方、元配列と同じメモリを参照するためメモリを効率的に使うことができるというメリットがあります。

コピーに関してはビューと逆で元配列と同じ要素を持った配列を複製するため変更が元の配列に反映されないというメリットがある一方、新たな配列を生成するためメモリを消費するというデメリットがあります。

ではここからはcopyメソッドとviewメソッドについて見ていきましょう。

copy()

ではコピーについて見ていきます。
以下のように配列に続けてcopy()と記述することで元の配列と同じ要素を持った新たな配列を生成することができます。

  1. arr1 = np.array([1, 2, 3])
  2. arr2 = arr1[0:1].copy()    # 配列を複製

今回生成した配列はコピーであるため元要素に対して変更は反映されません。

  1. arr2[0] = 100
  2. print(arr1)
  3. print(arr2)
[1 2 3]    # 元配列は変更されない [100]

view()

続いてビューの作成について見ていきましょう。ビューの作成もコピーの場合と同じで以下のように配列に続けてview()と記述します。

  1. arr1 = np.array([1, 2, 3])
  2. arr2 = arr1.view()
  3. print(arr2)
[1 2 3]    # ビューが生成される

そして上述したようにビューに変更を加えると元配列に対しても変更が反映されます。

  1. arr2[0] = 100
  2. print(arr1)
  3. print(arr2)
[100 2 3]    # 元配列に対しても変更が反映される [100 2 3]

まとめ

ではこのレッスンの内容を以下にまとめます。

  • ビューはメモリを効率的に使うことができる一方、元の配列に対して変更が反映される
  • 配列を複製したい場合にはcopy()を使用する
  • スライスは元の配列を参照する

ではこのレッスンは以上となります。演習課題にチャレンジしましょう

Lesson1

arrを以下のようにスライスした新たな配列(コピー)を生成してください。なお回答は変数answerに格納してください。正しくコピーが格納されていれば正解となります。

[[1] [4]]

関連レッスン

スライスによる参照

Last updated:2019/11/22

[[1]
 [4]]
  1. import numpy as np

  2. arr = np.array([[1, 2, 3],
  3. [4, 5, 6]])

  4. # 指定した配列をanswerに格納してください。

  5. answer = arr[:, :1].copy()
  6. print(answer)
main.py
設定
g
n
i
d
a
o
L