为什么下面的代码不像我预期的那样工作?
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]
干杯,菲利普
zz2j4svz1#
它与花式索引的工作原理有关。有一个完整的解释here。这样做是为了允许使用花哨的索引(即a[x>3] *= 2)进行就地修改。这样做的后果是,你不能像你发现的那样分配给一个双索引。花式索引总是返回一个副本而不是一个视图。
a[x>3] *= 2
vwkv1x7d2#
看起来你根本不能通过这样的双切片进行赋值。这是可行的:
a[numpy.where(a==1)[0][1:]] = 3
xmq68pz93#
因为a[a==1]部分实际上不是一个切片。它创建一个新数组。仔细想想,这是有道理的--您只接受满足布尔条件的元素(就像过滤操作)。
fdx2calv4#
这是你想要的
a[2:][a[2:]==1]=3
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])
5条答案
按热度按时间zz2j4svz1#
它与花式索引的工作原理有关。有一个完整的解释here。这样做是为了允许使用花哨的索引(即
a[x>3] *= 2
)进行就地修改。这样做的后果是,你不能像你发现的那样分配给一个双索引。花式索引总是返回一个副本而不是一个视图。vwkv1x7d2#
看起来你根本不能通过这样的双切片进行赋值。
这是可行的:
xmq68pz93#
因为a[a==1]部分实际上不是一个切片。它创建一个新数组。仔细想想,这是有道理的--您只接受满足布尔条件的元素(就像过滤操作)。
fdx2calv4#
这是你想要的
sdnqo3pr5#
根据使用NP的条件,在哪里可能很困难。我建议独立创建一个索引数组: