【Python】numpyにおけるcopy問題の詳細

2585 ワード

この文章はもともと私がsegmentfaultで答えたのですが、ますます単独で出す必要があると感じています.結局、この問題はよくあります.具体的にはnumpy公式文書を参照してください.
本文numpyについてcopyは3つのケースがあり、完全にコピー、ビュー(view)または浅いコピー(shallow copy)と深いコピー(deep copy)と呼ばれます.
一方、b = a[:]は、本質的にスライス操作(slicing)であり、すべてのスライス操作がビューを返す第2の形式に属する.具体的には、b = a[:]は新しいオブジェクトbを作成する(したがって、id(b)id(a)が返される結果は異なる)が、bのデータは完全にaから来ており、aと完全に一致している.言い換えれば、bのデータは完全にaによって保管されており、彼ら2つのデータの変化は一致している.次の例を参照してください.
a = np.arange(4)  # array([0, 1, 2, 3])
b = a[:]  # array([0, 1, 2, 3])

b.flags.owndata  #    False,b       
a.flags.owndata  #    True,    a   

#    a        b
a[-1] = 10  # array([0, 1, 2, 10])
b  #  array([0, 1, 2, 10])

#    b        a
b[0] = 10  # array([10, 1, 2, 10])
a  # array([10, 1, 2, 10])
b = ab = a[:]の違いは、後者が新しいオブジェクトを作成しないことです.両方の方法は、aおよびbのデータ相互影響をもたらす.aの変更がbに影響しないようにするには、次のようにします.
unique_b = a.copy()

END