为什么双切片numpy数组的赋值不起作用?

时间:2009-11-06 13:21:56

标签: python numpy variable-assignment slice

为什么以下行不能按预期工作?

import numpy as np
a = np.array([0,1,2,1,1])
a[a==1][1:] = 3
print a
>>> [0 1 2 1 1]
# I would expect [0 1 2 3 3]

这是一个'错误'还是有其他推荐的方式?

另一方面,以下工作:

a[a==1] = 3
print a
>>> [0 3 2 3 3]

干杯,菲利普

4 个答案:

答案 0 :(得分:10)

这与花哨索引的工作原理有关。有一个彻底的解释here。这样做是为了允许使用花式索引进行原位修改(即a[x>3] *= 2)。这样做的结果是你不能像你找到的那样分配一个双索引。花式索引始终返回副本而不是视图。

答案 1 :(得分:7)

看来你根本无法通过像这样的双切片进行任务。

但这有效:

a[numpy.where(a==1)[0][1:]] = 3

答案 2 :(得分:4)

因为a [a == 1]部分实际上不是切片。它创建了一个新数组。当你想到它时就有意义了 - 你只是采用满足布尔条件的元素(比如过滤操作)。

答案 3 :(得分:0)

这就是你想要的

a[2:][a[2:]==1]=3