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

Python 为什么双切片numpy数组的赋值不起作用?,python,numpy,variable-assignment,slice,Python,Numpy,Variable Assignment,Slice,为什么以下几行不像我预期的那样有效 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] 干杯,Philipp因为a[a==1]部分实际上不是一片。它会创

为什么以下几行不像我预期的那样有效

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]

干杯,Philipp因为a[a==1]部分实际上不是一片。它会创建一个新数组。仔细想想,这是有道理的——只取满足布尔条件的元素(如筛选操作)。

看起来,通过这样的双切片,您根本无法完成赋值

不过,这是可行的:

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

这正是你想要的

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

这与花式索引的工作方式有关。有一个彻底的解释。这样做是为了允许使用奇特的索引进行就地修改(即
a[x>3]*=2
)。这样做的一个结果是,您不能像您所发现的那样分配给双索引。奇特的索引总是返回一个副本而不是一个视图。

我认为这不太正确。如果你做了
a[a==1]=3
,这实际上改变了a的内容。@Dave-我认为这是perimosocodiae是正确的,你的反例是由于在numpy内部进行了某种类似于黑客的操作,以创建就地操作的外观。@tom10-这不是“黑客”。它是array类实现的一部分。行为被记录,例如,这里:。“切片一个数组会返回它的一个视图”,也就是说,不是一个副本。普通列表也是这样工作的——您可以分配给切片(仅适用于iterables)
l=range(10);l[5:]=range(5)
@Dave-当然,numpy中的切片是一个视图,但a[a==1]不是切片,也不是视图。但这需要事先知道1的第一次出现在位置1。实际上,您的解决方案修改了1的第一次出现,这不是他想要的。对-在您发表评论之前将其删除。嗨,菲利普,我是罗宾!嘿,罗宾-在这里见面的机会有多大。。。慕尼黑的干杯!