numpy中不同长度数组的数组比较

时间:2015-02-05 13:17:59

标签: python arrays numpy

大家好,请原谅我有限的编程知识。我有两个数组:

A =([[ 0.10111977,  0.5511177 ,  0.49532397,  0.42136468, 0.43345532],
     [ 0.3812068 ,  0.97679566,  0.20473656,  0.40256096, 0.32423426],
     [ 0.2387294 ,  0.88714084,  0.01064819,  0.48275173, 0.78234234]])

B = ([[ 0.10111977,  0.5511177 ,  0.49532397],
      [ 0.2387294 ,  0.88714084,  0.01064819]])

(他们实际上有成千上万行,但只是为了证明这个问题)。我想比较两者,以便找到B中的哪些行也存在于A中,以便将相关行复制到一个新的数组中,如下所示:

C =([[ 0.10111977,  0.5511177 ,  0.49532397,  0.42136468, 0.43345532],
     [ 0.2387294 ,  0.88714084,  0.01064819,  0.48275173, 0.78234234]])

我尝试的简单(强力)解决方案是做类似的事情:

for rowB in B:
    for rowA in A:
        if A[rowA,0]==B[rowB,0] and A[rowA,1]==B[rowB,1] and A[rowA,2]==B[rowB,2]:
            C.extend(row)
            continue

现在这将有效,但正如我所说,我的数据集非常庞大,而且需要永远。 有更简单\更快的方法吗?我想过插值,但我不知道如何用这些数据完成。

2 个答案:

答案 0 :(得分:1)

您可以使用设置逻辑:

SetA& setB将返回A中仅包含B的所有项目:

a = set(list1)
b = set(list2)
c = a & b

c现在将包含匹配项!

编辑,因为我没有看到numpy引用,如果你搜索文档,你可以找到你正在寻找的方法:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.intersect1d.html#numpy.intersect1d

答案 1 :(得分:0)

这是一个时间复杂度较高的版本[根据https://wiki.python.org/moin/TimeComplexity平均为O(n)]:

import numpy as np

def common_rows(A, B):
    items = set(tuple(row) for row in B)
    return np.array([row for row in A if tuple(row[:3]) in items])

n = 10000
A = np.random.rand(n, 5)
B = np.random.rand(n, 3)

# Make some common rows
B[123,:] = A[5775,:3]
B[1443,:] = A[85,:3]

print("-- Expected:")
print(B[123])
print(B[1443])
print("-- Got:")
print(common_rows(A, B))

Numpy没有set数据结构,因此我们将每行转换为Python对象。这有点效率低下,但对于大n来说应该更快。