首页 > 解决方案 > 当一个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数组的一部分只引用原始数组的内存地址,从而不复制数据条目?

标签: pythonarraysnumpy

解决方案


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


推荐阅读