为什么双切片的numpy数组赋值不生效?

15 投票
5 回答
3926 浏览
提问于 2025-04-15 15:44

为什么下面这些代码没有按照我预期的那样工作呢?

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]

这是一个“bug”吗?还是说有其他推荐的做法呢?

另一方面,下面的代码是可以正常工作的:

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

谢谢,Philipp

5 个回答

3

因为 a[a==1] 这一部分其实不是在切片。它是创建了一个新的数组。想想就明白了——你只是拿出了那些满足条件的元素(就像在过滤一样)。

10

这和“花式索引”是怎么工作的有关。这里有一个详细的解释 在这里。这样做是为了让你可以用花式索引直接修改数据(比如 a[x>3] *= 2)。这样做的一个结果就是,你不能像你发现的那样对双重索引进行赋值。花式索引总是返回一个副本,而不是一个视图。

9

看起来你不能通过那种双切片的方式来进行赋值。

不过这样做是可以的:

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

撰写回答