我不确定我为什么不能这样做:
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