Python在特定列上合并两个数组
我有两套/数组/表单列表Python在特定列上合并两个数组,python,arrays,performance,list,numpy,Python,Arrays,Performance,List,Numpy,我有两套/数组/表单列表 a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)] b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)] 我想找到c,它是a中b中的项目列表,因此只有元组中的前两个元素需要匹配(例如12 14)。因此,在这种情况下,答案是 c = [(12, 14, 44, 12), (19, 22, 96, 45)]
a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
我想找到c,它是a中b中的项目列表,因此只有元组中的前两个元素需要匹配(例如12 14)。因此,在这种情况下,答案是
c = [(12, 14, 44, 12), (19, 22, 96, 45)]
我使用嵌套循环,但是它太慢了。谢谢您可以使用列表来完成此操作
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> [item for item in b for checker in a if item[:2] == checker[:2]]
[(12, 14, 44, 12), (19, 22, 96, 45)]
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> c=[j for i in a for j in b if i[:2]==j[:2]]
您可以使用列表来完成此操作
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> [item for item in b for checker in a if item[:2] == checker[:2]]
[(12, 14, 44, 12), (19, 22, 96, 45)]
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> c=[j for i in a for j in b if i[:2]==j[:2]]
如果首先将a
中所有唯一的两项元组存储在一个集合中,则可以执行此操作O(N)
时间:
>>> keys = {x[:2] for x in a}
>>> [x for x in b if x[:2] in keys]
[(12, 14, 44, 12), (19, 22, 96, 45)]
请注意,如果您只是尝试匹配同一索引上的项目,则只需使用zip
和列表即可:
>>> [y for x, y in zip(a, b) if x[:2] == y[:2]]
[(12, 14, 44, 12), (19, 22, 96, 45)]
#Equivalent Numpy version:
>>> arr_a = np.array(a)
>>> arr_b = np.array(b)
>>> arr_b[(arr_b[:,:2] == arr_a[:,:2]).all(axis=1)]
array([[12, 14, 44, 12],
[19, 22, 96, 45]])
如果首先将a
中所有唯一的两项元组存储在一个集合中,则可以执行此操作O(N)
时间:
>>> keys = {x[:2] for x in a}
>>> [x for x in b if x[:2] in keys]
[(12, 14, 44, 12), (19, 22, 96, 45)]
请注意,如果您只是尝试匹配同一索引上的项目,则只需使用zip
和列表即可:
>>> [y for x, y in zip(a, b) if x[:2] == y[:2]]
[(12, 14, 44, 12), (19, 22, 96, 45)]
#Equivalent Numpy version:
>>> arr_a = np.array(a)
>>> arr_b = np.array(b)
>>> arr_b[(arr_b[:,:2] == arr_a[:,:2]).all(axis=1)]
array([[12, 14, 44, 12],
[19, 22, 96, 45]])
如果您使用的是
numpy
In [49]: a = np.array([(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)])
In [50]: b = np.array([(12, 14, 44.0, 12.0), (5, 4, 66.0, 12.0), (19, 22, 96.0, 45.0)])
In [51]: print b[np.all(a[:,:2]==b[:,:2],1)]
[[ 12. 14. 44. 12.]
[ 19. 22. 96. 45.]]
它是如何工作的?
In [52]: print a[:,:2]==b[:,:2]
[[ True True]
[False False]
[ True True]]
np.all
使用逻辑and沿可选第二个参数指定的轴(或使用所有元素)获取布尔数组并进行约简
当然,在我们的例子中,要使用的右轴是1
(注:我必须承认在处理数组值的类型时有点草率)如果您使用的是
numpy
,则可以使用numpy
In [49]: a = np.array([(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)])
In [50]: b = np.array([(12, 14, 44.0, 12.0), (5, 4, 66.0, 12.0), (19, 22, 96.0, 45.0)])
In [51]: print b[np.all(a[:,:2]==b[:,:2],1)]
[[ 12. 14. 44. 12.]
[ 19. 22. 96. 45.]]
它是如何工作的?
In [52]: print a[:,:2]==b[:,:2]
[[ True True]
[False False]
[ True True]]
np.all
使用逻辑and沿可选第二个参数指定的轴(或使用所有元素)获取布尔数组并进行约简
当然,在我们的例子中,要使用的右轴是1
(注:我必须承认在处理数组值的类型时有点马虎)列表理解
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> [item for item in b for checker in a if item[:2] == checker[:2]]
[(12, 14, 44, 12), (19, 22, 96, 45)]
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> c=[j for i in a for j in b if i[:2]==j[:2]]
输出:
[(12, 14, 44, 12), (19, 22, 96, 45)]
列表理解
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> [item for item in b for checker in a if item[:2] == checker[:2]]
[(12, 14, 44, 12), (19, 22, 96, 45)]
>>> a = [(12, 14, 0.3, 0.6, 0.8), (16, 18, 0.4, 0.5, 0.3), (19, 22, 0.4, 0.5, 0.3)]
>>> b = [(12, 14, 44, 12), (5, 4, 66, 12), (19, 22, 96, 45)]
>>> c=[j for i in a for j in b if i[:2]==j[:2]]
输出:
[(12, 14, 44, 12), (19, 22, 96, 45)]
编辑您的答案,因为OP似乎想要b元素,而不是a。@hagubear感谢您的通知,已经编辑了列表理解及其输出:)编辑您的答案,因为OP似乎想要b元素,而不是a。@hagubear感谢您的通知,已经编辑了列表理解及其输出:)这是怎么回事?在第二种情况下,键中的
x[:2]操作在最坏的情况下本身可能需要o(n),导致整个理解为o(m*n)@mu無 集合提供了O(1)
查找。@Ashwini Chaudhary快速提问,如果我想将a中的[0th 1st]索引与b中的[1st 2nd]索引匹配,你会如何修改它?@IanDaz我想如果x[1:3]在键中,它会变成[x对于b中的x]
@IanDaz,那么你可以简单地将if
条件更改为:if x[1:3]在按键中
。这是怎么回事?在第二种情况下,键中的x[:2]操作在最坏的情况下本身可能需要o(n),导致整个理解为o(m*n)@mu無 集合提供了O(1)
查找。@Ashwini Chaudhary快速提问,如果我想将a中的[0th 1st]索引与b中的[1st 2nd]索引匹配,你会如何修改它?@IanDaz我想如果x[1:3]在键中,它会变成[x对于b中的x]
@IanDaz,那么你可以简单地将if
条件更改为:if x[1:3]在键中
。在您的示例中,您有一个匹配项(使用numpy
索引)b[i,j]==a[i,]
其中j=0,1
,这是您要问的还是巧合?在您的示例中,您有一个匹配项(使用numpy
索引)b[i,j]==a[i,]
其中j=0,1
,这就是你要问的还是巧合?@SaulloCastro一个简单、快速、难以捉摸的裸体解决方案,嗯@索洛·卡斯特罗:一个简单、快速、高深莫测的解决方案,嗯!