我正在慢慢尝试理解numpy 中view
s 和copy
s 之间的区别,以及可变类型与不可变类型的区别。
如果我使用“高级索引”访问数组的一部分,它应该返回一个副本。这似乎是真的:
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.]])
所以,看起来,即使我使用高级索引,赋值仍然把左边的东西当作一个视图。显然第a
2 行与第 6 行是相同的对象/数据a
,因为变异c
对其没有影响。
所以我的问题是:第a
8 行中的对象/数据是否与以前相同(当然不包括对角线)还是副本?换句话说,是a
的数据被复制到了新的a
,还是它的数据在原地发生了变异?
例如,是不是这样:
x = [1,2,3]
x += [4]
或喜欢:
y = (1,2,3)
y += (4,)
我不知道如何检查这一点,因为在任何一种情况下,a.flags.owndata
都是True
. 如果我以一种令人困惑的方式思考这个问题,请随时详细说明或回答不同的问题。