コピーでのNumpy配列の割り当て


103

例えば、我々は持っている場合はnumpy、配列をA、私たちは望んnumpy配列Bと同じ要素を持つが。

次の(下記を参照)メソッドの違いは何ですか?追加のメモリはいつ割り当てられ、いつ割り当てられませんか?

  1. B = A
  2. B[:] = AB[:]=A[:]?と同じ)
  3. numpy.copy(B, A)

回答:


127

3つのバージョンすべてが異なることを行います。

  1. B = A

    これにより、Bすでに名前が付けられている既存のオブジェクトに新しい名前がバインドされAます。その後、それらは同じオブジェクトを参照するため、1つをその場で変更すると、もう1つのオブジェクトでも変更が表示されます。

  2. B[:] = AB[:]=A[:]?と同じ)

    これにより、の値がA既存の配列にコピーされますB。これが機能するには、2つのアレイが同じ形状でなければなりません。B[:] = A[:]同じことB = A[:]を行います(ただし、1のようなことを行います)。

  3. numpy.copy(B, A)

    これは正しい構文ではありません。たぶんB = numpy.copy(A)。これは2とほぼ同じですが、B配列を再利用するのではなく、新しい配列を作成します。以前のB値への参照が他にない場合、最終結果は2と同じになりますが、コピー中に一時的により多くのメモリを使用します。

    またはnumpy.copyto(B, A)、あなたはを意味し、それは合法であり、2と同等ですか?


21
@Mr_and_Mrs_D:Numpy配列はリストとは異なる動作をします。配列をスライスしてもコピーは作成されず、既存の配列のデータに新しいビューが作成されるだけです。
Blckknght 2017

はどういう意味but B = A[:] would do something more like 1ですか?これによると、stackoverflow.com / new_list = old_list[:] a / 2612815もコピーです。
mrgloom 2018年

4
@mrgloom:Numpy配列は、内容のスライスとコピーに関して、リストとは動作が異なります。配列は、数値が格納されているメモリの基本ブロックの「ビュー」です。likeスライスsome_array[:]を実行すると、新しい配列オブジェクトが作成されますが、その新しいオブジェクトは、コピーされていない元の配列と同じメモリのビューになります。だから私はそれがもっと似ていると言ったB = A。実際のコピーが必要とするそれぞれのO(1)ものではなく、スペースと時間しかかかりませんO(n)
Blckknght

27
  1. B=A 参照を作成します
  2. B[:]=A コピーを作る
  3. numpy.copy(B,A) コピーを作る

最後の2つには追加のメモリが必要です。

使用する必要がある深いコピーを作成するには B = copy.deepcopy(A)


2
2番目の例を参照すると、オブジェクトタイプの配列の深いコピーは作成されB[:] = AませA = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')。今してみてくださいB[:] = A; B[0][0]=99、これは両方の最初の要素を変更しますAとB!私の知る限り、numpy-arrayであっても、ディープコピーを保証する方法は他にありませんcopy.deepcopy
Rolf Bartstra

11

これが私にとって唯一の有効な答えです:

B=numpy.array(A)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.