使用Numpy以矢量化方式检索多个值的索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Numpy以矢量化方式检索多个值的索引相关的知识,希望对你有一定的参考价值。

为了在numpy数组中获得与“99”值对应的索引,我们执行以下操作:

mynumpy=([5,6,9,2,99,3,88,4,7))
np.where(my_numpy==99)

如果,我想获得对应于以下值99,55,6,3,7的索引怎么办?显然,可以通过一个简单的循环来实现它,但我正在寻找更多的矢量化解决方案。我知道Numpy非常强大所以我认为它可能存在类似的东西。

期望的输出:

searched_values=np.array([99,55,6,3,7])
np.where(searched_values in mynumpy)
[(4),(),(1),(5),(8)]
答案

这是与np.searchsorted的一种方法 -

def find_indexes(ar, searched_values, invalid_val=-1):
    sidx = ar.argsort()
    pidx = np.searchsorted(ar, searched_values, sorter=sidx)
    pidx[pidx==len(ar)] = 0
    idx = sidx[pidx]
    idx[ar[idx] != searched_values] = invalid_val
    return idx

样品运行 -

In [29]: find_indexes(mynumpy, searched_values, invalid_val=-1)
Out[29]: array([ 4, -1,  1,  5,  8])

对于通用的无效值说明符,我们可以使用np.where -

def find_indexes_v2(ar, searched_values, invalid_val=-1):
    sidx = ar.argsort()
    pidx = np.searchsorted(ar, searched_values, sorter=sidx)
    pidx[pidx==len(ar)] = 0
    idx = sidx[pidx]
    return np.where(ar[idx] == searched_values, idx, invalid_val)

样品运行 -

In [35]: find_indexes_v2(mynumpy, searched_values, invalid_val=None)
Out[35]: array([4, None, 1, 5, 8], dtype=object)

# For list output
In [36]: find_indexes_v2(mynumpy, searched_values, invalid_val=None).tolist()
Out[36]: [4, None, 1, 5, 8]

以上是关于使用Numpy以矢量化方式检索多个值的索引的主要内容,如果未能解决你的问题,请参考以下文章

用于多个开始和停止值的矢量化 NumPy linspace

两个 1D numpy / torch 数组的特殊索引以生成另一个数组

在 numpy 数组中查找多个值的行索引

以矢量化方式连接给定开始,停止数字的范围数组 - NumPy

使用numpy选择排除某些索引的数组中最小值的索引

1.1.1.4NumPy为什么很快