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

问题描述 投票:0回答:5

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

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]

干杯,菲利普

python numpy variable-assignment slice
5个回答
10
投票

这与花式索引的工作原理有关。 这里有详尽的解释。这样做是为了允许使用花哨的索引进行就地修改(即

a[x>3] *= 2
)。这样做的结果是您无法像您所发现的那样分配给双索引。花式索引总是返回副本而不是视图。


9
投票

看来你根本无法通过这样的双切片来完成作业。

这确实有效:

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

3
投票

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


0
投票

这就是你想要的

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

0
投票

根据使用 np.where 的条件,可能会很困难。 我建议独立创建一个索引数组:

a = np.array([0,1,2,1,1])
pos_to_change = np.arange(0,len(a))[a==1][1:]
a[pos_to_change] = 3
print(a)
>>> array([0, 1, 2, 3, 3])
© www.soinside.com 2019 - 2024. All rights reserved.