Python 快速过滤大量类似numpy的阵列

Python 快速过滤大量类似numpy的阵列,python,numpy,Python,Numpy,我将让代码解释我试图做什么-我认为这非常简单: import numpy as np arr1 = (1e5 * np.random.rand(int(1e4))).astype(int) arr2 = (1e5 * np.random.rand(int(1e3))).astype(int) arr3 = np.random.rand(int(1e4)) maskFn = lambda val: val in arr2 maskArr = np.vectorize(maskFn)(arr1)

我将让代码解释我试图做什么-我认为这非常简单:

import numpy as np

arr1 = (1e5 * np.random.rand(int(1e4))).astype(int)
arr2 = (1e5 * np.random.rand(int(1e3))).astype(int)
arr3 = np.random.rand(int(1e4))

maskFn = lambda val: val in arr2
maskArr = np.vectorize(maskFn)(arr1)

outArr = arr3[maskArr]
我的解决方案适用于少量数据,但我现在使用的是非常沉重的数组,业余代码的滞后是无法克服的。一个更基于磁盘的解决方案,最大限度地减少内存开销也会很好-我还没有内存限制,但我希望我很快就会


非常感谢您的帮助

我找到了我需要的功能

它是
np.isin
。它的速度快了几个数量级,更重要的是,它可以用非常大的阵列进行适当的扩展。示例解决方案:

import numpy as np

arr1 = (1e5 * np.random.rand(int(1e4))).astype(int)
arr2 = (1e5 * np.random.rand(int(1e3))).astype(int)
arr3 = np.random.rand(int(1e4))

maskArr = np.isin(arr1, arr2)

outArr = arr3[maskArr]
如果数组值是唯一的(如字典键),这会更快:您可以在
np.isin
中标记
假设_unique=True
,并且它使用更高效的算法。(当然,这里提供的示例数组不是唯一的,但我的实际数据集中的数组是唯一的。)


感谢那些回答我第一个堆栈溢出代码问题的人!你有用的暗示把我推向了正确的方向。事实上,仅仅“大声”解释我的问题是一个很大的帮助。

不应该将lambda赋值给变量。我猜这段代码只是一个例子?您的程序中的数据来自哪里?
np.vectorize
不是一个有效的工具-即使免责声明隐藏在注释中
arr3[[(arr2中的val)对于arr1中的val]]
做同样的事情,对吗?也许同样快?这段代码只是一个例子,是的。数据来自磁盘上的一个hdf文件,其类型和形状与此处所示相同。我已经确认I/O缓慢不是问题所在
arr3[[(arr2中的val)对于arr1中的val]]
看起来也一样快,或者说,实际上也一样慢!这是我首先尝试的解决方案;我改为使用
np.vectorize
,徒劳地希望它会更快。出于好奇,为什么我不应该将lambda赋值给变量?我知道没有必要这样做,但如果这样可以使代码更易于阅读,为什么不呢?将lambda指定给变量(或不指定)只是一种风格。