首页 > 解决方案 > 切片分配的 Numpy 切片意外失败

问题描述

切片+赋值操作的尝试意外失败:

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

标签: pythonnumpypython-3.6

解决方案


这不起作用的原因是因为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 元组,其中包含以下x索引True

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

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


推荐阅读