python - 切片分配的 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
解决方案
这不起作用的原因是因为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]),)
然后我们对该数组进行切片,并分配切片数组的索引。
推荐阅读
- java - 为什么 javax.persistence-api 在 spring data jpa starter 中被 jakarta.persistence-api 取代了?
- r - 如何在 R 中使用 for 迭代重现多个图(ggplot)?
- git - 如何处理不同环境的代码
- mysql - 找不到模块:无法使用 Next.js mysql Express React 解析“.../node_modules/destroy”中的“fs”
- c# - 服务结构无法在 Visual Studio 中看到容器模板
- android - 单例服务的初始化不能从 AppComponentFactory 访问?
- c# - 约束线上最近点
- java - 访问使用 getFragmentbyTag() 初始化的 Fragment 中的视图
- java - 如何使用 jqwik 生成排序后的数字数组
- google-cloud-platform - 创建新的 Dialogflow 代理时“无法设置 GCP 项目”