代码之家  ›  专栏  ›  技术社区  ›  James Steele

numpy.in1d悬挂/长运行时间

  •  0
  • James Steele  · 技术社区  · 6 年前

    我有两个numpy数组,ar1的长度是37015400,ar2的长度是25000。我想返回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 回复  |  直到 6 年前
        1
  •  0
  •   LATNI El Mehdi    6 年前

    我遇到了同样的问题,用一个巨大的数据集进行1d计算花了我几个小时。最后,我用一个简单的循环来完成它,循环速度更快。对我来说是 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;
    

    你可以替换最后一个 if 条件 if j>i+some_threshold 如果不使用时间序列(y=f(t))。