12

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

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

4 回答 4

10

这与花哨的索引如何工作有关。这里有详尽的解释。这样做是为了允许使用花哨的索引(即a[x>3] *= 2)进行就地修改。这样做的结果是您无法分配给您找到的双索引。花式索引总是返回一个副本而不是一个视图。

于 2009-11-06T14:01:06.930 回答
8

看来您根本无法通过这样的双切片进行分配。

这虽然有效:

a[numpy.where(a==1)[0][1:]] = 3
于 2009-11-06T13:53:36.497 回答
3

因为 a[a==1] 部分实际上并不是一个切片。它创建一个新数组。当您考虑它时,这是有道理的——您只采用满足布尔条件的元素(如过滤器操作)。

于 2009-11-06T13:36:06.937 回答
0

这做你想要的

a[2:][a[2:]==1]=3
于 2009-11-06T13:59:42.273 回答