【发布时间】:2018-07-17 18:05:50
【问题描述】:
我有两个 numpy 数组,ar1 的长度为 37,015,400,ar2 的长度为 25,000。我想返回 ar2 中的 ar1 的值,以及 ar1 的索引。为此,我使用了 np.in1d() 函数。数组的值将始终是字符串,即使完全由整数组成。以下代码正是我想要的,并且在我的机器上运行不到一分钟:
ar1 = np.array([str(i) for i in np.arange(0,37015400)])
ar2 = np.array([str(i) for i in np.arange(0,25000)])
indarr = np.asarray(range(0,len(ar1 )))
vals = ar1[np.in1d(ar1, ar2)]
indices = indarr[np.in1d(ar1, ar2)]
我遇到的问题是,当用于 实际 数据时,此过程会无限期运行(45 分钟后终止)。我让我的程序打印出它正在使用的两个数组的类型和形状,下面是直接复制粘贴:
ar1 shape (37015400,) <class 'numpy.ndarray'> ar2 shape <class 'numpy.ndarray'> (25000,)
我还让它打印了两个数组:
ar1:
['100000016587' '100000019688' '100000040778' ... '999999946478'
'999999982896' '999999992154']
ar2:
['833004729085' '999821141210' '107560272544' ... '976513345947'
'514020550330' '646320590498']
我检查了两个数组的每个值都是一个字符串。我已经尝试了一切,但我无法弄清楚为什么这个程序会挂起。什么可能导致这种类型的错误?什么可能导致运行时间显着增加?
【问题讨论】:
-
您可能需要查看
in1d代码。它根据数据(大小、排序等)采用不同的方法。基本上,它连接数组、排序和查找重复项。 -
你的实际数据比你的玩具数据大多少?
-
顺便说一句,你最终计算了两次
in1d,这对你没有任何好处。您可以将np.in1d(ar1, ar2)的结果保存为掩码,这是一种显着减少运行时间的廉价方法。 -
@Tgsmith61591 实际数据的大小与示例完全相同。一定有一些事情我错过了,因为我可以将 ar1 放入数据框中并使用 pd.series.isin(ar2) 并且它在 30 秒内运行。我可以将此作为我的答案提交,但我希望使用纯 numpy,因为它通常更快。