繁体   English   中英

Python-返回两个数组的交集

[英]Python - return intersection of two arrays

我有两个数组,我想返回一个新数组,该数组等于我原来的两个数组的交集。 两个原始数组的长度应相同。 例如,如果我有:

arr1 = np.array([(255, 255, 255), (255, 255, 255)])

arr2 = np.array([(255, 255, 255), (255, 255, 255)])

我应该得到:

intersectedArr = ([(255, 255, 255), (255, 255, 255])

但是,如果我有:

arr1 = np.array([(100, 100, 100), (255, 255, 255)])

arr2 = np.array([(255, 255, 255), (255, 255, 255)])

我应该得到

([(255, 255, 255)])

到目前为止,我已经尝试过:

intersectedArr = np.intersect1d(arr1, arr2)

但这返回[255]而不是预期的([(255, 255, 255)])

有人可以帮忙吗? 提前致谢!

不知道您的数组会变大,但是如果它们仍然很小,这可能会起作用:

import numpy as np

arr1 = np.array([(255, 255, 255), (255, 255, 255)])
arr2 = np.array([(255, 255, 255), (255, 255, 255)])
intersectedArr = []

for a1, a2 in zip(arr1, arr2):
    if np.array_equal(a1, a2):
        intersectedArr.append(a1)
print(np.array(intersectedArr))

arr1 = np.array([(100, 100, 100), (255, 255, 255)])
arr2 = np.array([(255, 255, 255), (255, 255, 255)])
intersectedArr = []

for a1, a2 in zip(arr1, arr2):
    if np.array_equal(a1, a2):
        intersectedArr.append(a1)
print(np.array(intersectedArr))

numpy答案怎么样?

import numpy as np


arr1 = np.array([(255, 255, 255), (255, 255, 25)])  # changed some to 25
arr2 = np.array([(255, 25, 255), (255, 255, 25)])

arr1[np.where(arr1==arr2)]

array([255, 255, 255, 255,  25])

第二个例子

arr1 = np.array([(100, 100, 100), (255, 255, 255)])
arr2 = np.array([(255, 255, 255), (255, 255, 255)])

arr1[np.where(arr1==arr2)]

array([255, 255, 255])

如果您想保留重复项,例如您的示例,则可以使用列表推导:

def intersection(list_a, list_b):
    return [ e for e in list_a if e in list_b ]

产生:

in:
    [(255, 255, 255), (255, 255, 255)]
    [(255, 255, 255), (255, 255, 255)]
out:
    [(255, 255, 255), (255, 255, 255)]

in:
    [(100, 100, 100), (255, 255, 255)]
    [(255, 255, 255), (255, 255, 255)]
out:
    [(255, 255, 255)]

但是,如果您想要列表(集合)之间的唯一组合:

def intersection(a, b):
    return list(set(a).intersection(b))

产生:

in:
    [(255, 255, 255), (255, 255, 255)]
    [(255, 255, 255), (255, 255, 255)]
out:
    [(255, 255, 255)]

in:
    [(100, 100, 100), (255, 255, 255)]
    [(255, 255, 255), (255, 255, 255)]
out:
    [(255, 255, 255)]

干杯!

注意 :这假设[a, b, c][b, c, a]给出[a, b, c] ,即元素的顺序被忽略。

好的,我做了一些实验,这可能就是您想要的。 鉴于:

arr1a = np.array([(255, 255, 255), (255, 255, 255)])
arr1b = np.array([(100, 100, 100), (255, 255, 255)])
arr2 = np.array([(255, 255, 255), (255, 255, 255)])

然后我们可以找到与的交集:

np.array([item in arr2 for item in arr1a])

即,对于arr1a每个元素,检查是否也出现在arr2 结果为:

>>> array([ True,  True], dtype=bool)

类似地:

np.array([item in arr2 for item in arr1b])
>>> array([False,  True], dtype=bool)

现在,我们可以使用此结果从原始列表中选择通用值:

mask = np.array([item in arr2 for item in arr1a])
arr1a[mask]
>>> array([[255, 255, 255],
           [255, 255, 255]])

和:

mask = np.array([item in arr2 for item in arr1b])
arr1b[mask]
>>> array([[255, 255, 255]])

对于更大的数组,使用pandas的groupby和cumcount可能会有所帮助:

In [11]: df1 = pd.DataFrame(arr1)

In [12]: df1["cumcount"] = df1.groupby([0, 1, 2]).cumcount()

In [13]: df1
Out[13]:
     0    1    2  cumcount
0  100  100  100         0
1  255  255  255         0

In [14]: df2 = pd.DataFrame(arr2)

In [15]: df2["cumcount"] = df2.groupby([0, 1, 2]).cumcount()

In [16]: df2
Out[16]:
     0    1    2  cumcount
0  255  255  255         0
1  255  255  255         1

现在,合并将为您提供所需的数组:

In [21]: df1.merge(df1).iloc[:, :3].values
Out[21]:
array([[100, 100, 100],
       [255, 255, 255]])

In [22]: df1.merge(df2).iloc[:, :3].values
Out[22]: array([[255, 255, 255]])

In [23]: df2.merge(df2).iloc[:, :3].values
Out[23]:
array([[255, 255, 255],
       [255, 255, 255]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM