按行搜索一个数组中另一个数组的元素-Python/NumPy
例如,我有一个独特元素的矩阵按行搜索一个数组中另一个数组的元素-Python/NumPy,python,numpy,Python,Numpy,例如,我有一个独特元素的矩阵 a=[ [1,2,3,4], [7,5,8,6] ] 和另一个唯一的矩阵,该矩阵充满了第一个矩阵中出现的元素 b=[ [4,1], [5,6] ] 我期待着结果 [ [3,0], [1,3] ]. 也就是说,我想找到b的每一行元素,它等于同一行中a的一些元素,返回a中这些元素的索引。 我该怎么做?谢谢。如果您不介意使用循环,这里有一个使用np的快速解决方案。其中: import numpy as np a=[[
a=[
[1,2,3,4],
[7,5,8,6]
]
和另一个唯一的矩阵,该矩阵充满了第一个矩阵中出现的元素
b=[
[4,1],
[5,6]
]
我期待着结果
[
[3,0],
[1,3]
].
也就是说,我想找到b的每一行元素,它等于同一行中a的一些元素,返回a中这些元素的索引。
我该怎么做?谢谢。如果您不介意使用循环,这里有一个使用np的快速解决方案。其中:
import numpy as np
a=[[1,2,3,4],
[7,5,8,6]]
b=[[4,1],
[5,6]]
a = np.array(a)
b = np.array(b)
c = np.zeros_like(b)
for i in range(c.shape[0]):
for j in range(c.shape[1]):
_, pos = np.where(a==b[i,j])
c[i,j] = pos
print(c.tolist())
您可以这样做:
np.split(pd.DataFrame(a).where(pd.DataFrame(np.isin(a,b))).T.sort_values(by=[0,1])[::-1].unstack().dropna().reset_index().iloc[:,1].to_numpy(),len(a))
# [array([3, 0]), array([1, 3])]
这是一种矢量化方法-
# https://stackoverflow.com/a/40588862/ @Divakar
def searchsorted2d(a,b):
m,n = a.shape
max_num = np.maximum(a.max() - a.min(), b.max() - b.min()) + 1
r = max_num*np.arange(a.shape[0])[:,None]
p = np.searchsorted( (a+r).ravel(), (b+r).ravel() ).reshape(m,-1)
return p - n*(np.arange(m)[:,None])
def search_indices(a, b):
sidx = a.argsort(1)
a_s = np.take_along_axis(a,sidx,axis=1)
return np.take_along_axis(sidx,searchsorted2d(a_s,b),axis=1)
样本运行-
In [54]: a
Out[54]:
array([[1, 2, 3, 4],
[7, 5, 8, 6]])
In [55]: b
Out[55]:
array([[4, 1],
[5, 6]])
In [56]: search_indices(a, b)
Out[56]:
array([[3, 0],
[1, 3]])
另一个矢量化的-
你只需要独立地考虑每一行,它没有明确的排序,我已经改变了例子。<代码> A/<代码>中的条目保证是唯一的吗?欢迎来到!你的问题似乎没有任何逻辑?您能解释一下您需要对其执行哪些操作/流程吗?a和b中的每一行是否都有独特的元素?谢谢。但当我处理海量数据时,速度会慢得多。我想用矩阵的方式来解决这个问题,只是因为需要更快的处理速度。@Navaro通常的NumPy方式(在引擎罩下,即执行的方式)是用C实现的。所以,是的,看到这些在原生NumPy中实现会很好。目前,我只是在现有工具的基础上进行构建。
In [65]: (a[:,None,:]==b[:,:,None]).argmax(2)
Out[65]:
array([[3, 0],
[1, 3]])