【问题标题】:Get boolean array indicating which elements in array which belong to a list获取布尔数组,指示数组中哪些元素属于列表
【发布时间】:2026-01-24 03:25:01
【问题描述】:

这似乎是一个简单的问题,但我很长一段时间以来一直在努力解决错误。 想象一个数组

a = np.array([2,3,4,5,6])

我想测试数组中哪些元素属于另一个列表

[2,3,6]

如果我这样做了

a in [2,3,6]

Python 引发“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”

作为回报,我想得到一个类似布尔数组的

array([ True,  True, False, False,  True], dtype=bool)

【问题讨论】:

  • 请您举例说明您的输出应该是什么样子,包括输出应该是什么数据类型(例如,它是列表还是 numpy 数组?)另外请说明a 是否是总是一维的,或者如果它可以有更多的维度,那么在这种情况下包含一个输出示例。
  • 目前提供了两个答案,一个产生array([[0], [1], [4]]),另一个产生[0, 1, 4],由于没有说明要求,无法知道哪个更合适。这就是为什么说明需要什么输出的问题很重要。
  • 嗨@alaniwi,感谢您的cmets。作为回报,我更喜欢 boolena 数组。例如[对,对,错,错,对]。
  • 感谢您添加返回类型。我建议对问题进行编辑以删除有关“...的索引”的位,因为这意味着您想要与列表中的位置相关的整数,这与您所说的想要一个布尔数组相矛盾。无论如何,您会看到其中一个答案会产生您想要的布尔数组作为计算索引数组的中间体。
  • 感谢@alaniwi 改进问题。我已批准修改。

标签: python arrays list numpy


【解决方案1】:

使用np.isin 创建一个布尔掩码,然后在此掩码上使用np.argwhere 来查找非零数组元素的索引:

m = np.isin(a, lst)
indices = np.argwhere(m)

# print(m)
array([ True,  True, False, False,  True])

# print(indices)
array([[0], [1], [4]])

【讨论】:

    【解决方案2】:
    import numpy as np
    
    arr1 = np.array([2,3,4,5,6])
    arr2 = np.array([2,3,6])
    arr_result = [bool(a1 in arr2) for a1 in arr1]
    print(arr_result)
    

    我使用简单的列表理解逻辑来做到这一点。

    输出:

    [True,True,False,False,True]
    

    【讨论】: