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

Numpy slice of a slice assignment fails unexpectedly

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

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

这不起作用的原因是因为 x[x] 不是 "view",而是一个副本,然后您在该副本的一部分上赋值。但该副本永远不会保存。实际上,如果我们评估 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) 将 return 包含索引的一元组 xTrue:

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

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