14

numpyviewの s とs の違い、および可変型と不変型の違いをゆっくりと理解しようとしています。copy

「高度なインデックス」を使用して配列の一部にアクセスすると、コピーが返されるはずです。これは本当のようです:

In [1]: import numpy as np
In [2]: a = np.zeros((3,3))
In [3]: b = np.array(np.identity(3), dtype=bool)

In [4]: c = a[b]

In [5]: c[:] = 9

In [6]: a
Out[6]: 
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

は単なるコピーであるためc、データを共有せず、変更しても変化しませんa。しかし、これは私を混乱させるものです:

In [7]: a[b] = 1

In [8]: a
Out[8]: 
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

したがって、高度なインデックス作成を使用しても、割り当ては左側のものをビューとして扱います。2 行目は6 行a目と同じオブジェクト/データであることは明らかです。ac

だから私の質問:a行 8 は以前と同じオブジェクト/データですか (もちろん対角線は数えません)、それともコピーですか? つまり、aのデータが新しい にコピーされたのaか、それともそのデータが変更されたのか?

たとえば、次のようなものですか。

x = [1,2,3]
x += [4]

または好き:

y = (1,2,3)
y += (4,)

a.flags.owndataどちらの場合も であるため、これを確認する方法がわかりませんTrue。私がこれについて紛らわしい方法で考えている場合は、お気軽に詳しく説明するか、別の質問に答えてください。

4

3 に答える 3

10

を実行するとc = a[b]、が唯一の引数としてa.__get_item__呼び出され、返されたものはすべて に割り当てられます。bc

を実行するとa[b] = c、がおよび引数としてa.__setitem__呼び出され、返されたものは黙って破棄されます。bc

したがって、a[b]構文は同じですが、どちらの式も異なる処理を行っています。をサブクラス化ndarrayし、この 2 つの関数をオーバーロードして、異なる動作をさせることができます。numpy のデフォルトと同様に、前者はコピーを返しますが (b配列の場合)、後者はその場で変更aします。

于 2013-03-28T21:13:33.343 に答える
4

はい、同じオブジェクトです。確認方法は次のとおりです。

>>> a
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
>>> a2 = a
>>> a[b] = 1
>>> a2 is a
True
>>> a2
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

Python で何らかの式に代入することは、その式の値を読み取ることと同じではありません。を実行するc = a[b]a[b]、等号の右側に新しいオブジェクトが返されます。等号の左側にある を実行すると、元のオブジェクトが変更されますa[b] = 1a[b]

実際、次のような式は、バインドされている名前を変更a[b] = 1 できません。a処理するコードは、そのオブジェクトを参照するために使用された名前ではなくobj[index] = value、オブジェクトを認識するだけobjなので、その名前が参照するものを変更することはできません。

于 2013-03-28T20:53:04.293 に答える