所以我有两个数组,它们具有相同的尺寸,但不同的lenght。
arr1 = np.Array([[IND1],[IND2],[IND3]])
arr2 = np.Array([[IND7],[IND3],[IND3],[IND4]])
我需要获得具有相同位置并且在两个数组中相同的元素的位置和价值。
在示例情况下,预期答案将是:
位置= 2
value = ind3
我将python与numpy模块一起使用。
带有numpy数组,您可能需要以矢量化的方式工作以进行性能并使用数组切片。考虑到这一点,这是输入阵列a
和b
-
n = min(len(a), len(b))
out_idx = np.flatnonzero(a[:n] == b[:n])
out_val = a[out_idx] # or b[out_idx] both work
这要照顾多个匹配。
样本运行 -
In [224]: a = np.array([3, 8, 9, 2, 1, 7])
In [225]: b = np.array([1, 2, 9, 7, 5, 7, 0, 4])
In [226]: n = min(len(a), len(b))
...: out_idx = np.flatnonzero(a[:n] == b[:n])
...: out_val = a[out_idx]
...:
In [227]: out_idx
Out[227]: array([2, 5])
In [228]: out_val
Out[228]: array([9, 7])
对于索引及其值的输出列表 -
In [229]: zip(out_idx, out_val)
Out[229]: [(2, 9), (5, 7)]
对于索引的漂亮词典输出和相应的值 -
In [230]: {i:j for i,j in zip(out_idx, out_val)}
Out[230]: {2: 9, 5: 7}
假设列表称为lst_1
和lst_2
,您可以做
for i in range(min(len(lst_1), len(lst_2)):
if lst_1[i] == lst_2[i]:
return lst_1[i], i
这将返回包含公共元素及其索引的元组。请注意,如果有多个匹配项,则将返回第一场比赛;如果不存在匹配项,则返回None
。
您也可以使用InterSect1d获得相同的值:
np.intersect1d(a,b)
我试图比较两个不同尺寸的阵列时遇到了相同的问题。我只是将这些转换为列表,现在它不会发出任何警告/错误。
我用来将数组转换为列表的代码是 -
import numpy as np
np.array([[1,2,3],[4,5,6]]).tolist()