我构造一个数组,
a=np.tile(np.arange(5),4)
a
>>>array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
我设置了一些条件,
mask=a!=0
a[mask]
>>>array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
现在我想用偶数元素替换奇数索引元素,然后尝试
a[mask][1::2]=a[mask][::2]
a
array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])
但它没有任何改变。
答案 0 :(得分:1)
Boolean index返回数据的副本而不是视图。 与索引数组一样,返回的是数据的副本,而不是通过切片获取的视图。由于a[mask]
是副本a[mask][1::2]
赢了&t更改原始数组。
您可以使用np.flatnonzero
保留原始非零索引,使用奇数和偶数位置对索引进行子集,然后使用索引进行赋值,而不是使用布尔掩码:
a=np.tile(np.arange(5),4)
idx = np.flatnonzero(a != 0)
a[idx[1::2]] = a[idx[::2]]
a
# array([0, 1, 1, 3, 3, 0, 1, 1, 3, 3, 0, 1, 1, 3, 3, 0, 1, 1, 3, 3])