numpy.in1d挂起/运行时间长

时间:2018-07-17 18:05:51

标签: arrays numpy

我有两个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']

我检查了一下,两个数组的每个值都是一个字符串。我已经尝试了一切,但无法弄清楚为什么该程序挂起。是什么原因导致这种类型的错误?什么可能导致运行时间显着增加?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,花了我几个小时进行大量数据集的indd计算。最后,我使用了一个简单的循环来完成它,速度更快。就我而言,这是一个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)),则可以用if替换最后一个if j>i+some_threshold条件。