Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在特定列上合并两个数组_Python_Arrays_Performance_List_Numpy - Fatal编程技术网

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,它是ab中的项目列表,因此只有元组中的前两个元素需要匹配(例如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一个简单、快速、难以捉摸的裸体解决方案,嗯@索洛·卡斯特罗:一个简单、快速、高深莫测的解决方案,嗯!