python - 当一个numpy数组被切片时,有没有办法不制作副本?
问题描述
我需要numpy
在我的项目中处理一些大型数组。从磁盘加载这样的阵列后,将消耗我计算机一半以上的内存。
加载数组后,我对其进行了若干切片(将选择几乎一半的数组),然后收到错误消息,告诉我内存不足。
通过做一个我理解的小实验,我收到错误,因为当对numpy
数组进行切片时,将创建一个副本
import numpy as np
tmp = np.linspace(1, 100, 100)
inds = list(range(100))
tmp_slice = tmp[inds]
assert id(tmp) == id(tmp_slice)
返回AssertionError
有没有办法让numpy
数组的一部分只引用原始数组的内存地址,从而不复制数据条目?
解决方案
通读this , this , and this我认为您的问题在于使用高级切片,并重申其中一个答案——numpy docs明确指出
高级索引始终返回数据的副本(与返回视图的基本切片相反)。
所以不要这样做:
inds = list(range(100))
tmp_slice = tmp[inds]
你应该使用:
tmp_slice = tmp[:100]
这将产生一个视图而不是一个副本。您可以通过尝试注意到差异:
tmp[0] = 5
在第一种情况下tmp_slice[0]
会返回1.0
,但在第二种情况下会返回5
。
推荐阅读
- html - 如何防止用户修改页面输入的值
- node.js - 使用 Firebase 身份验证和我自己的数据库来保存用户的 Express 后端
- python - 一种热编码与 pd.get_dummies
- firebase - 在 Firebase 中缓存
- jquery - 将 .click 转换为单击 jquery ajax
- arrays - swift:不能在不可变值上使用变异成员:下标是 get-only
- python - Repl.it DB 429 客户端错误:对 url 的请求过多(Python)
- python - 让网络用户输入代表公式的代码的安全方法是什么?
- google-chrome-extension - Chrome 92 升级中的 ExtensionSidebarPane 是否损坏?
- android - Flutter Firestore 未在已发布的 android apk 中检索任何数据