gpt4 book ai didi

python - 组合索引操作时查看和复制与 NumPy 数组的混淆

转载 作者:行者123 更新时间:2023-12-01 02:35:21 25 4
gpt4 key购买 nike

>>> a = np.arange(12).reshape(3,4)

>>> a[0:3:2, :][:, [0,2]] = 100 ### the first time
>>> a
array([[100, 1, 100, 3],
[ 4, 5, 6, 7],
[100, 9, 100, 11]])

>>> a[:, [0, 2]][0:3:2, :] = 0 ### second time
>>> a
array([[100, 1, 100, 3],
[ 4, 5, 6, 7],
[100, 9, 100, 11]])

我对 python 中的 View 和副本感到非常困惑。上面的代码显示,第一次将数组a中给定的行和列更改为100,这改变了原始数组a。

但是,第二次时原始数组没有改变。这是为什么?

最佳答案

使用 [:, [0,2]] 进行查找将返回一个副本,因为它是 advanced indexing 。但是,当您分配给切片(例如array[whatever] = sth)时,它不会创建副本,而是分配给指定的项目,即使它是高级索引。

因此第一个示例有效,因为第一个切片返回一个 View ,然后它对 View 的切片使用赋值。

但是,第二个“失败”,因为您分配给副本的一个切片(因为高级索引是在常规索引之前完成的)。

差异主要是因为另一种方法负责设置( __setitem__ )切片而不是获取( __getitem__ )这些切片。要反汇编您的语句:

a[0:3:2, :][:, [0,2]] = 100 

a.__getitem__((slice(0, 3, 2), slice(None))).__setitem__((slice(None), [0, 2]), 100)
|-------------- returns a view ------------|

而第二个是:

a[:, [0,2]][0:3:2, :] = 0

a.__getitem__((slice(None), [0, 2])).__setitem__((slice(0, 3, 2), slice(None)), 0)
|--------- returns a copy ---------|

关于python - 组合索引操作时查看和复制与 NumPy 数组的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46308370/

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