我有两个数组,我试图返回一个新数组,它等于我原来的两个数组的交集。两个原始数组应该具有相同的长度。例如,如果我有:
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)])
有人可以帮忙吗?提前谢谢!
答案 0 :(得分:3)
不确定你的数组会有多大,但如果它们仍然很小,这可能会起作用:
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))
答案 1 :(得分:1)
如果你想保留重复项,就像在你的例子中一样,你可以使用列表理解:
registrationConfirm()
产生:
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))
干杯!
答案 2 :(得分:0)
注意:这假定[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]])
答案 3 :(得分:0)
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])
答案 4 :(得分:0)
对于较大的数组,使用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]])