如何在条件数组中写入或替换新值?

时间:2018-02-28 01:32:01

标签: python arrays numpy boolean mask

我构造一个数组,

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])

但它没有任何改变。

1 个答案:

答案 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])