【Python】numpyにおけるcopy問題の詳細
2585 ワード
この文章はもともと私がsegmentfaultで答えたのですが、ますます単独で出す必要があると感じています.結局、この問題はよくあります.具体的には
本文
一方、
END
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 = a
とb = a[:]
の違いは、後者が新しいオブジェクトを作成しないことです.両方の方法は、a
およびb
のデータ相互影響をもたらす.a
の変更がb
に影響しないようにするには、次のようにします.unique_b = a.copy()
END