gpt4 book ai didi

python - 使用高级索引的赋值是否复制数组数据?

转载 作者:太空狗 更新时间:2023-10-29 17:31:36 25 4
gpt4 key购买 nike

我正在慢慢尝试理解 numpy 中的 viewcopy 之间的区别,以及可变类型与不可变类型之间的区别。

如果我使用 'advanced indexing' 访问数组的一部分它应该返回一个副本。这似乎是真的:

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.]])

所以,看起来,即使我使用高级索引,赋值仍然把左边的东西当作一个 View 。显然,第 2 行中的 a 与第 6 行中的 a 是相同的对象/数据,因为改变 c 对其没有影响。

所以我的问题是:第 8 行中的 a 是与之前相同的对象/数据(当然不包括对角线)还是副本?换句话说,是 a 的数据被复制到新的 a,还是它的数据就地发生了变异?

例如,是不是这样:

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

或喜欢:

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

我不知道如何检查这一点,因为在任何一种情况下,a.flags.owndata 都是 True。如果我以一种令人困惑的方式思考这个问题,请随时详细说明或回答不同的问题。

最佳答案

当你执行 c = a[b] 时,a.__get_item__ 被调用,b 作为它唯一的参数,无论返回什么分配给 c

当你执行 a[b] = c 时,a.__setitem__ 会用 bc 调用作为参数,返回的任何内容都会被默默地丢弃。

因此,尽管具有相同的 a[b] 语法,但两个表达式都在做不同的事情。您可以将 ndarray 子类化,重载这两个函数,并让它们表现不同。与 numpy 中的默认情况一样,前者返回一个副本(如果 b 是一个数组)但后者修改 a 到位。

关于python - 使用高级索引的赋值是否复制数组数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15691740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com