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