为了账号安全,请及时绑定邮箱和手机立即绑定

获取两个2D numpy数组的相交行

获取两个2D numpy数组的相交行

犯罪嫌疑人X 2019-09-03 15:53:07
我想在两个2D numpy数组中获得相交(公共)行。例如,如果以下数组作为输入传递:array([[1, 4],       [2, 5],       [3, 6]])array([[1, 4],       [3, 6],       [7, 8]])输出应该是:array([[1, 4],       [3, 6])我知道如何用循环来做这件事。我正在寻找一种Pythonic / Numpy方式来做到这一点。
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

对于短数组,使用集合可能是最清晰,最易读的方法。


另一种方法是使用numpy.intersect1d。你必须欺骗它将行视为单个值,但是......这使得事情的可读性降低了......


import numpy as np


A = np.array([[1,4],[2,5],[3,6]])

B = np.array([[1,4],[3,6],[7,8]])


nrows, ncols = A.shape

dtype={'names':['f{}'.format(i) for i in range(ncols)],

       'formats':ncols * [A.dtype]}


C = np.intersect1d(A.view(dtype), B.view(dtype))


# This last bit is optional if you're okay with "C" being a structured array...

C = C.view(A.dtype).reshape(-1, ncols)

对于大型数组,这应该比使用集合快得多。


查看完整回答
反对 回复 2019-09-03
?
Helenr

TA贡献1780条经验 获得超3个赞

你可以使用Python的集合:


>>> import numpy as np

>>> A = np.array([[1,4],[2,5],[3,6]])

>>> B = np.array([[1,4],[3,6],[7,8]])

>>> aset = set([tuple(x) for x in A])

>>> bset = set([tuple(x) for x in B])

>>> np.array([x for x in aset & bset])

array([[1, 4],

       [3, 6]])

正如Rob Cowie指出的那样,这可以更简洁地完成


np.array([x for x in set(tuple(x) for x in A) & set(tuple(x) for x in B)])

可能有一种方法可以做到这一点,而不是从数组到元组的所有来回,但它现在不会来找我。


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 883 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信