我尝试将代码从 Matlab 转换为 Python 我在 Matlab 中有代码:
[value, iA, iB] = intersect(netA{i},netB{j});
我正在寻找 python 中的代码,这些代码可以找到 A 和 B 的公共(public)值,以及索引向量 ia 和 ib(对于每个公共(public)元素,它在 A 中的第一个索引和它在 B 中的第一个索引)。
我尝试使用不同的解决方案,但我收到了不同长度的向量。尝试使用 numpy.in1d/intersect1d ,但返回的值不一样。 我尝试做的事情:
def FindoverlapIndx(self,a, b):
bool_a = np.in1d(a, b)
ind_a = np.arange(len(a))
ind_a = ind_a[bool_a]
ind_b = np.array([np.argwhere(b == a[x]) for x in ind_a]).flatten()
return ind_a, ind_b
IS=np.arange(IDs[i].shape[0])[np.in1d(IDs[i], R_IDs[j])]
IR = np.arange(R_IDs[j].shape[0])[np.in1d(R_IDs[j],IDs[i])]
我收到了不同长度的索引。但两者的长度必须与 Matlab 的 intersect
中的长度相同。
最佳答案
a
和b
的公共(public)值,已排序- 他们每个人在
a
中的第一个位置 - 它们在
b
中的第一个位置
NumPy 的 intersect1d
只做第一部分。所以我读了它的 source并修改它以返回索引。
import numpy as np
def intersect_mtlb(a, b):
a1, ia = np.unique(a, return_index=True)
b1, ib = np.unique(b, return_index=True)
aux = np.concatenate((a1, b1))
aux.sort()
c = aux[:-1][aux[1:] == aux[:-1]]
return c, ia[np.isin(a1, c)], ib[np.isin(b1, c)]
a = np.array([7, 1, 7, 7, 4]);
b = np.array([7, 0, 4, 4, 0]);
c, ia, ib = intersect_mtlb(a, b)
print(c, ia, ib)
这会打印出 [4 7] [4 0] [2 0]
,这与 MATLAB documentation page 上的输出一致,因为我使用了与他们相同的示例。当然,与 MATLAB 不同,索引在 Python 中是从 0 开始的。
说明:该函数从每个数组中取出唯一元素,将它们放在一起并连接:结果为[0 1 4 4 7 7]
。每个数字在这里最多出现两次;当它重复时,这意味着它在两个数组中。这就是 aux[1:] == aux[:-1]
选择的原因。
数组ia
包含原始数组a
中a1
的每个元素的第一个索引。通过 isin(a1, c)
过滤它只留下 c
中的索引。 ib
也是如此。
编辑:
从版本 1.15.0 开始,intersect1d如果您通过 return_indices=True
,则执行第二部分和第三部分:
x = np.array([1, 1, 2, 3, 4])
y = np.array([2, 1, 4, 6])
xy, x_ind, y_ind = np.intersect1d(x, y, return_indices=True)
从哪里可以得到 xy = array([1, 2, 4])
、x_ind = array([0, 2, 4])
和 y_ind = 数组([1, 0, 2])
关于python - 如何在 Python 中查找相交索引和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45637778/