我有一个非常大的数组(包含数百万个元素),我需要根据几个不同的条件选取其中的一小部分(几百个)。目前我正在使用 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])
然后稍后使用ipts从各种数组中提取正确的点。 但是,在np.where行上,我遇到了MemoryError。 我已经在几篇其他相关帖子中看到过np.where可能会占用内存并复制数据的情况。
在那里有多个&符号是否意味着数据被多次复制?有没有更有效的方法来切片数据,既减少内存压力,又保留我想要的索引列表,以便我可以将相同的切片在以后的多个位置中使用?
请注意,我发布的这个示例实际上不会生成错误,但结构类似于我所拥有的。
iens
,azpt
,...)?一种选择是批处理操作,取大数组的切片并相应地移动np.where
的结果。此外,您可以考虑使用 Numba 加速循环代替向量化操作,尽管您事先不知道结果数量。 - jdehesawhere
的方式并不是它的正确用法。对于你正在做的事情,numpy.nonzero
可能会提高一点性能。(这并没有真正回答你有关复制的问题,但还是想加上这句话) - Paul H(x<.3)
会生成一个与x
形状相同的布尔数组。(x<.3)&(y<.3)
将产生一个新的布尔数组,其形状取决于x
和y
如何相互广播。因此,如果x
、y
和/或z
很大,则构建条件数组可能会占用大量内存。我认为nonzero
本身并不会使用更多的内存 - 只需要返回其结果所需的空间即可。 - hpaulj