切片分配的numpy切片意外失败

时间:2019-09-06 17:57:20

标签: python numpy python-3.6

这种切片+分配操作的尝试意外失败:

>>> x = np.array([True, True, True, True])
>>> x[x][0:2] = False
>>> x
array([ True,  True,  True,  True])

我想了解为什么上面的简化代码片段未能分配基础数组值。

看似等效的切片+分配操作确实有效,例如:

>>> x = np.array([True, True, True, True])
>>> x[0:4][0:2] = False
>>> x
array([False, False,  True,  True])

np.version.version == 1.17.0

1 个答案:

答案 0 :(得分:1)

之所以不起作用,是因为x[x]不是“视图”,而是副本,因此您可以在该副本的一个切片上进行分配。但是该副本永远不会保存。确实,如果我们评估x[x],那么我们会发现它没有基础:

>>> x[x].base is None
True

但是,我们可以通过首先计算索引来分配前两个或后五个等项目:

>>> x = np.array([True, True, True, True])
>>> x[np.where(x)[0][:2]] = False
>>> x
array([False, False,  True,  True])

此处np.where(x)将返回一个1元组,其中包含xTrue的索引:

>>> np.where(x)
(array([0, 1, 2, 3]),)

然后我们对该数组进行切片,并分配切片数组的索引。