我让代码解释我想做的事情-我认为这很简单:
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]
我的解决方案适用于少量数据,但是我现在正在处理非常庞大的数组,而我的业余代码方面的滞后是压倒性的。一个基于磁盘的解决方案也可以最大程度地减少内存开销,这也很好-我还没有内存限制,但是我希望很快...
任何帮助都将成为[[super感谢!
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]
如果数组值是唯一的(例如字典键),这甚至更快:您可以在assume_unique = True
中标记np.isin
,并且使用更有效的算法。 (当然,这里提供的示例数组不是唯一的,但实际数据集中的数组是唯一的。)
感谢那些回答了我第一个Stack Overflow代码问题的人!您的有用提示使我朝着正确的方向前进。确实,只是“大声”解释我的问题,对我有很大帮助。