gpt4 book ai didi

python - numpy数组被切片两次

转载 作者:行者123 更新时间:2023-12-01 04:33:24 25 4
gpt4 key购买 nike

我不确定我是否理解为什么这不起作用:

a = np.zeros((10, ))

# first slicing array
pos1 = np.zeros((10, ), dtype=np.bool)
pos1[::2] = True

a[pos1] = 1.
print a
# returns [ 1. 0. 1. 0. 1. 0. 1. 0. 1. 0.]


# second slicing array
pos2 = np.zeros((5, ), dtype=np.bool)
pos2[::2] = True

a[pos1][pos2] = 2.

print a
# still returns [ 1. 0. 1. 0. 1. 0. 1. 0. 1. 0.]

为什么第二次切片没有影响整个数组?我认为 a[pos1] 只是原始数组子部分的“ View ”......我错过了什么吗?

(这个例子只是一个简单的例子,没有实际用途,只是为了尝试理解,因为我经常使用这种语法,但我没想到这个结果)

最佳答案

这与最近的问题相同 Numpy doesn't change value of an array element after masking

您使用的是 bool 掩码,因此 a[pos1]是副本,而不是切片。

第一组有效,因为它是直接调用 __setitem__ :

a[pos1] = 1.
a.__setitem__(pos1) = 1

第二个不是因为 set适用于a[pos1] ,副本:

a[pos1][pos2] = 2.
a.__getitem__(pos1).__setitem__(pos2)

a[::2][pos2]=3确实有效,因为 a[::2]是一个切片 - 即使它产生与 a[pos1] 相同的值.

检查某物是副本还是 View 的一种方法是查看数组的数据指针

 a.__array_interface__['data']
a[pos1].__array_interface__['data'] # will be different
a[::2].__array_interface__['data'] # should be the same

关于python - numpy数组被切片两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063014/

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