【问题标题】:Retrieve indexes of multiple values with Numpy in a vectorization way使用 Numpy 以矢量化方式检索多个值的索引
【发布时间】:2018-03-02 10:20:15
【问题描述】:

为了在 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)]

【问题讨论】:

标签: python numpy indexing


【解决方案1】:

这是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]

【讨论】:

  • 哇哦,多谢了,确实看起来像另一个问题,但你考虑到特殊情况,所以我不知道该怎么办。
  • @hansglick 不知道你的意思 - “不知道该怎么做”的事情:)
  • 看看你的stackoverflow个人资料,我怎么给你发私信?
  • 如果元素多次出现怎么办。我希望能够检索所有索引。 find_indexes(np.array([5,11,5]),np.array([5])) 。期望的输出 [(0,2)]
  • @hansglick,您应该在原始问题中包含一些重复项。
猜你喜欢
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2012-03-30
  • 2011-10-16
  • 2022-07-29
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多