Python在特定列上合并两个数组

2024-04-24 13:35:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个集合/数组/列表

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这是b中的项目列表,可以在a中找到,这样元组中只有前两个元素需要匹配(例如12 14)。所以在这种情况下,答案是

^{pr2}$

我使用了嵌套循环,但是太慢了。谢谢


Tags: 项目答案元素列表情况数组元组嵌套循环
3条回答

如果先将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和列表理解:

^{pr2}$

如果使用的是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.]]

它是如何工作的?

^{pr2}$

np.all接受布尔数组,并使用逻辑and沿可选第二个参数指定的轴(或使用所有元素)进行约简

In [53]: print np.all(a[:,:2]==b[:,:2])
False

In [69]: print np.all(a[:,:2]==b[:,:2],1)
[ True False  True]

In [70]: print np.all(a[:,:2]==b[:,:2],0)
[False False]

In [71]:

当然,在我们的例子中,正确使用的轴是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)]

相关问题 更多 >