【问题标题】:Numpy where with array comparisonNumpy where 与数组比较
【发布时间】:2019-08-25 09:29:55
【问题描述】:

我有一个名为Y 的数组,其中包含类标签。我想找到与列表实验室指定的多个值匹配的 Y 的所有索引。

在这种情况下:

Y = np.array([1,2,3,1,2,3,1,2,3,1,2,3])
labs = [2,3]

我怎样才能做类似np.where(Y == labs) 的返回

array([1,2,4,5,7,8,10,11])

我知道一种可能性是遍历列表实验室并进行元素比较。但我正在寻找一种更加基于 pythonic/numpy 的解决方案,它可以避免循环。

【问题讨论】:

    标签: numpy indexing python-3.7


    【解决方案1】:

    您可以在 np.isin(..) [numpy-doc] 上使用 np.where(..) [numpy-doc]

    >>> np.where(np.isin(Y, L))[0]
    array([ 1,  2,  4,  5,  7,  8, 10, 11])
    

    .isin(Y, L) 将为我们提供TrueFalse 的数组,其中Y 的项目与L 中的元素匹配:

    >>> np.isin(Y, labs)
    array([False,  True,  True, False,  True,  True, False,  True,  True,
           False,  True,  True])
    

    通过np.where(..),我们将Trues 映射到相应的索引。

    正如@hpaulj 所说,对于小的Ls,我们可以这样写:

    np.any([Y == li for li in labs],axis=0)

    在这里,对于labs 中的每个元素,我们将检查Y 是否是那个元素,并且我们使用np.any(..) 在它们之间创建一个“逻辑OR 链”以将其折叠为布尔值。

    【讨论】:

    • np.any([Y==i for i in labs],axis=0) 这个小例子实际上比isin 快。但是in1d 在第二个参数足够小时使用这样的迭代。
    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多