切片分配的 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 包含索引的一元组 x
是 True
:
>>> np.where(x)
(array([0, 1, 2, 3]),)
然后我们对该数组进行切片,并分配切片数组的索引。
切片+赋值操作的尝试意外失败:
>>> 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 包含索引的一元组 x
是 True
:
>>> np.where(x)
(array([0, 1, 2, 3]),)
然后我们对该数组进行切片,并分配切片数组的索引。