【问题标题】:Finding indices of matches of one array in another array在另一个数组中查找一个数组的匹配索引
【发布时间】:2016-02-14 04:42:57
【问题描述】:

我有两个 numpy 数组,A 和 B。A 包含唯一值,B 是 A 的子数组。 现在我正在寻找一种方法来获取 A 中 B 值的索引。

例如:

A = np.array([1,2,3,4,5,6,7,8,9,10])
B = np.array([1,7,10])
# I need a function fun() that:
fun(A,B)
>> 0,6,9

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以将np.in1dnp.nonzero 一起使用-

    np.nonzero(np.in1d(A,B))[0]
    

    您也可以使用np.searchsorted,如果您关心维护订单-

    np.searchsorted(A,B)
    

    对于一般情况,当A & B 是未排序的数组时,您可以在np.searchsorted 中引入sorter 选项,就像这样-

    sort_idx = A.argsort()
    out = sort_idx[np.searchsorted(A,B,sorter = sort_idx)]
    

    我也会添加我最喜欢的broadcasting 来解决一般情况 -

    np.nonzero(B[:,None] == A)[1]
    

    示例运行 -

    In [125]: A
    Out[125]: array([ 7,  5,  1,  6, 10,  9,  8])
    
    In [126]: B
    Out[126]: array([ 1, 10,  7])
    
    In [127]: sort_idx = A.argsort()
    
    In [128]: sort_idx[np.searchsorted(A,B,sorter = sort_idx)]
    Out[128]: array([2, 4, 0])
    
    In [129]: np.nonzero(B[:,None] == A)[1]
    Out[129]: array([2, 4, 0])
    

    【讨论】:

    • 这假设我们不关心订单;它为 B=[1,7,10] 返回与 [1, 10, 7] 相同的结果。 (OP的问题没有指定任何一种方式。)
    • @DSM 有用的 cmets!谢谢!使其通用。
    • 文档建议现在使用 isin 而不是 in1d
    【解决方案2】:

    你试过searchsorted吗?

    A = np.array([1,2,3,4,5,6,7,8,9,10])
    B = np.array([1,7,10])
    
    A.searchsorted(B)
    # array([0, 6, 9])
    

    【讨论】:

      【解决方案3】:

      仅出于完整性考虑:如果 A 中的值不是负数且相当小:

      lookup = np.empty((np.max(A) + 1), dtype=int)
      lookup[A] = np.arange(len(A))
      indices  = lookup[B]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多