Python 比numpy更节省内存的选项。在哪里?

Python 比numpy更节省内存的选项。在哪里?,python,numpy,memory-management,Python,Numpy,Memory Management,我有一个大的数组(几百万个元素),我需要根据几个不同的标准切掉其中的一小部分(几百个)。我目前正在使用np.where,大致如下: for threshold in np.arange(0,1,.1): x=np.random.random(5000000) y=np.random.random(5000000) z=np.random.random(5000000) inds=np.where((x < threshold) & (y > t

我有一个大的数组(几百万个元素),我需要根据几个不同的标准切掉其中的一小部分(几百个)。我目前正在使用np.where,大致如下:

for threshold in np.arange(0,1,.1):
    x=np.random.random(5000000)
    y=np.random.random(5000000)
    z=np.random.random(5000000)
    inds=np.where((x < threshold) & (y > threshold) & (z > threshold) & (z < threshold+0.1))

DoSomeJunk(a[inds], b[inds], c[inds])
np.arange(0,1,1)中阈值的
:
x=np.随机.随机(5000000)
y=np.随机。随机(5000000)
z=np.随机.随机(5000000)
inds=np,其中((xthreshold)&(z>threshold)&(z
然后使用IPT从各种阵列中提取正确的点。然而,我在那条np.where线上得到了MemoryError。我在其他几篇相关的文章中看到,np.where可能是一个内存占用器,并复制数据

在那里有多个&是否意味着数据被复制多次?有没有一种更有效的方法来切片数据,这种方法占用的内存更少,而且还保留了我想要的索引列表,以便我以后可以在多个地方使用相同的切片


请注意,我发布的这个示例实际上并没有生成错误,但其结构与我的类似

在每种情况下,您都要创建一个临时布尔数组,其大小与
x
y
z
相同。要对此进行优化,可以迭代创建掩码:

for threshold in np.arange(0,1,.1):
    x=np.random.random(5000000)
    y=np.random.random(5000000)
    z=np.random.random(5000000)
    inds = x < threshold
    inds &= y > threshold
    inds &= z > threshold
    inds &= z < threshold+0.1

DoSomeJunk(a[inds], b[inds], c[inds])
np.arange(0,1,1)中阈值的
:
x=np.随机.随机(5000000)
y=np.随机。随机(5000000)
z=np.随机.随机(5000000)
inds=x<阈值
inds&=y>阈值
inds&=z>阈值
inds&=z<阈值+0.1
DoSomeJunk(a[inds],b[inds],c[inds])

在本例中,这将把内存使用量从160 MB减少到40 MB。

尝试使用np.logical_,并应用结果仅得到基于它的一小部分:--您的_数组[np.logical_和(iens(11.25*azpt),iangsdet_of st<(11.25*(azpt+1))]不同数组的形状是什么(
iens
azpt
,…)一种选择是批处理操作,取大数组的切片,并转换<代码> NP的结果。在那里,
相应地,也可以考虑NUBBA加速循环而不是矢量化操作,虽然您不知道结果的数量。从名称上看不清楚,但是您是如何使用<代码>的< < /代码】。>这不是它的用途。对于你正在做的
numpy。非零可能会挤出更多的性能。(这并不能真正解决你关于拷贝的问题,但我想我还是要添加它)我试着清理一下这个例子。这实际上并没有产生内存错误,但在结构上与我实际代码中的类似…
(xOK谢谢。那么,为了澄清,我是否也可以做inds=np.where(inds&(下一个检查))要以迭代方式嵌套where,这也会减少内存?where与您的布尔数组相比,有什么具体原因吗?示例中的
np.where
调用是多余的,因为您可以使用布尔数组的奇特索引来索引数组。换句话说
a[inds]
完全等同于
a[np.where(inds)]
,但后者需要创建新数组。您可以在此处阅读有关布尔索引的更多信息:。