【问题标题】:Search elements of one array in another, row-wise - Python / NumPy在另一个数组中逐行搜索一个数组的元素 - Python / NumPy
【发布时间】:2020-04-17 22:11:21
【问题描述】:

例如,我有一个独特元素的矩阵,

a=[
    [1,2,3,4],
    [7,5,8,6]
]

还有另一个独特的矩阵,其中填充了第一个矩阵中出现的元素。

b=[
    [4,1],
    [5,6]
]

我期待结果

[
    [3,0],
    [1,3]
].

也就是说,我想找到b的每一行元素等于a的一些元素在同一行,返回这些元素在a中的索引。 我怎样才能做到这一点?谢谢。

【问题讨论】:

  • 你只需要独立考虑每一行和stackoverflow.com/questions/432112/…
  • 不是绝对排序的,我换了例子。
  • a 中的条目保证是唯一的吗?
  • 欢迎来到 SO!您的问题似乎没有任何逻辑?你能解释一下你想对它做什么操作/过程吗?
  • a 和 b 中的每一行都有唯一的元素吗?

标签: python numpy


【解决方案1】:

你可以这样做:

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])]

【讨论】:

    【解决方案2】:

    这是一种矢量化方法 -

    # 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]])
    

    另一个利用 broadcasting 的矢量化 -

    In [65]: (a[:,None,:]==b[:,:,None]).argmax(2)
    Out[65]: 
    array([[3, 0],
           [1, 3]])
    

    【讨论】:

    • @Navaro 嗯,通常的 NumPy 方式(在引擎盖下,即高性能的方式)是在 C 中实现的。所以,是的,很高兴看到这些在本机 NumPy 中实现。目前,我只是在现有工具的基础上进行构建。
    【解决方案3】:

    如果您不介意使用循环,这里有一个使用 np.where 的快速解决方案:

    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())
    

    【讨论】:

    • 谢谢。但是当我处理大量数据时,速度会慢很多。我希望它以矩阵方式解决,只是因为需要更快的处理速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2012-01-05
    • 2020-06-11
    相关资源
    最近更新 更多