大家好,请原谅我有限的编程知识。我有两个数组:
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
现在这将有效,但正如我所说,我的数据集非常庞大,而且需要永远。 有更简单\更快的方法吗?我想过插值,但我不知道如何用这些数据完成。
答案 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
来说应该更快。