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

v09wglhw  于 2023-10-19  发布在  其他
关注(0)|答案(5)|浏览(97)

为什么下面的代码不像我预期的那样工作?

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]

干杯,菲利普

zz2j4svz

zz2j4svz1#

它与花式索引的工作原理有关。有一个完整的解释here。这样做是为了允许使用花哨的索引(即a[x>3] *= 2)进行就地修改。这样做的后果是,你不能像你发现的那样分配给一个双索引。花式索引总是返回一个副本而不是一个视图。

vwkv1x7d

vwkv1x7d2#

看起来你根本不能通过这样的双切片进行赋值。
这是可行的:

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

xmq68pz93#

因为a[a==1]部分实际上不是一个切片。它创建一个新数组。仔细想想,这是有道理的--您只接受满足布尔条件的元素(就像过滤操作)。

fdx2calv

fdx2calv4#

这是你想要的

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

sdnqo3pr5#

根据使用NP的条件,在哪里可能很困难。我建议独立创建一个索引数组:

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

相关问题