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

Python 以矢量化方式使用Numpy检索多个值的索引,python,numpy,indexing,Python,Numpy,Indexing,为了获得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_v

为了获得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])
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]
对于一般无效值说明符,我们可以使用
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 [29]: find_indexes(mynumpy, searched_values, invalid_val=-1)
Out[29]: array([ 4, -1,  1,  5,  8])
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]

下面是一种使用
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])
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]
对于一般无效值说明符,我们可以使用
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 [29]: find_indexes(mynumpy, searched_values, invalid_val=-1)
Out[29]: array([ 4, -1,  1,  5,  8])
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]


看看这个@Kasramvd重新打开,因为此问题还需要屏蔽
搜索的\u值中不存在的元素。希望这看起来是公平的。是的,Divakar的解决方案考虑了一个特殊情况,即不存在值。是否存在多个值?一个涉及多个值的类似问题。接受的答案使用了默认词典。请检查此项@Kasramvd重新打开,因为此问题还需要屏蔽
搜索的\u值中不存在的元素。希望这看起来是公平的。是的,Divakar的解决方案考虑了一个特殊情况,即不存在值。是否存在多个值?一个涉及多个值的类似问题。被接受的答案使用了默认字典。Waou,Thk很多,确实看起来像是另一个问题,但你考虑了特殊情况,所以我不知道该怎么办。@hansglick不确定你所说的“不知道该怎么办”的意思:)看看你的stackoverflow配置文件,如何向您发送私人消息?如果元素多次出现,该怎么办。我希望能够检索所有索引。查找索引(np.array([5,11,5]),np.array([5])。期望输出[(0,2)]@hansglick,你应该在原始问题中包含一些重复项。Waou,thks很多,确实看起来像是另一个问题,但你考虑了特殊情况,所以我不知道该怎么做。@hansglick不确定你所说的“不知道该做什么”的意思:)看看你的stackoverflow配置文件,如何向您发送私人消息?如果元素多次出现,该怎么办。我希望能够检索所有索引。查找索引(np.array([5,11,5]),np.array([5])。期望输出[(0,2)]@hansglick,你应该在原始问题中包含一些重复项。