以下の最小限の例を考えてみましょう。さまざまな入れ子の深さのリスト要素をコピーすることについて、誰かが明らかに矛盾した論理numpy
を説明できますか?numpyの配列をコピーするときの動作が一貫していないようです。
import numpy as np
L = [[[[1, 1], 2, 3]]]
A1 = np.array(L)
A2 = A1.copy()
A1[0][0][2] = 'xx'
A1[0][0][0][0] = 'yy'
print "\nA1 after changes:\n{}".format(A1)
print "\nA2 only partially changed:\n{}".format(A2)
結果:
A1 after changes:
[[[['yy', 1] 2 'xx']]]
A2 only partially changed:
[[[['yy', 1] 2 3]]]
その後:
>>> print A1[0][0][2] == A2[0][0][2]
False
>>> print A1[0][0][0][0] == A2[0][0][0][0]
True
私は3
が交換されていない理由を自分自身に説明する苦労を持っていますが、より深いレベルでの1
です。
A2 = np.array(A, copy=True)
とA2 = np.empty_like(A); np.copyto(A4, A)
A2 = A[:]
上記のコードはA2 = A
と同じ振る舞いと同じように振る舞う:両方が同一で変化import copy; A2 = copy.deepcopy(A)
私は独立して作成することが見出さ唯一の解決策であり、後コピー。
深いコピーだけがこれを止めることが分かったとすれば、あなたを混乱させる原因は何ですか?他のケースでは、*同じ参照可能なオブジェクトへの参照をコピーしています*。 – jonrsharpe
これは 'dtype = object'という配列を持っているからです...基本的には、Pythonリストと2つのPython整数への参照を保持する配列を持っています。配列をコピーすると、単に参照がコピーされます。 – mgilson
私は重複が気に入らない。ナンシーアレイには特別なコピーの問題があります。また、 'dtype'オブジェクト配列はこの問題をさらに複雑にします。この質問を再開する必要があります。 – hpaulj