【问题标题】:numpy.in1d hanging/long run timenumpy.in1d 挂起/长时间运行
【发布时间】: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,因为它通常更快。

标签: arrays numpy


【解决方案1】:

我遇到了同样的问题,我用一个巨大的数据集进行 in1d 计算需要几个小时。最后,我使用了一个更快的简单循环来完成它。就我而言,这是一个datetime 对象比较。这就像在做in1d(t1,t2)(t1 最大的数据集)。

tmp=0
t_out,y_out,idx=[],[],[]
for i in range(t2.shape[0]):
    for j in range(tmp,t1.shape[0]):
        if t1[j]==t2[i]:
            t_out.append(t1[j])
            y_out.append(y1[j])
            idx.append(j)
            tmp=j 
        if t1[j]>dt2[i]+timedelta(0,900):
            break;

如果您不使用时间序列 (y=f(t)),可以将最后一个 ifcondition 替换为 if j&gt;i+some_threshold

【讨论】:

  • MATLAB ismember 函数做得更快。最好将两个变量分别保存到.mat 文件中。
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 2015-10-07
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多