我不确定我为什么不能这样做:

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]只是原始数组子部分的“视图” ...我缺少什么吗?

(此示例只是一个没有实际用途的简单示例,它只是试图理解原因,因为我经常使用这种语法,但我没想到会有此结果)

最佳答案

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

您正在使用布尔掩码,因此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]相同。

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

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

10-06 15:24