python中列表子集的布尔索引

Posted

技术标签:

【中文标题】python中列表子集的布尔索引【英文标题】:boolean indexing from a subset of a list in python 【发布时间】:2014-02-03 05:40:54 【问题描述】:

我有一个名称数组,以及相应的数据数组。从名称数组中,还有一个较小的名称子集:

data = np.array([75., 49., 80., 87., 99.])
arr1 = np.array(['Bob', 'Joe', 'Mary', 'Ellen', 'Dick'], dtype='|S5')
arr2 = np.array(['Mary', 'Dick'], dtype='|S5')

我正在尝试创建一个仅与出现在 arr2 中的名称相对应的新数据数组。这是我自己想出的:

TF = []
for i in arr1: 
    if i in arr2:
        TF.append(True)
    else:
        TF.append(False)
new_data = data[TF]

有没有更有效的不涉及 for 循环的方法?我应该提到,数组本身是从外部文件输入的,实际上有多个数据数组,所以我无法真正改变任何东西。

【问题讨论】:

似乎没有人能在文档中找到set routines。 (事实上​​,没有一个单独的函数链接到它们的列表,而是全部引用 numpy.lib.arraysetopts 并让您猜测如何搜索它,这可能无济于事。但是顶部带有导航栏的现代文档应该已经解决了这个问题……) 【参考方案1】:

您可以使用numpy.in1d,它测试一个数组中的每个元素是否也存在于第二个数组中。

演示

>>> new_data = data[np.in1d(arr1, arr2)]
>>> new_data
array([ 80.,  99.])

in1d 返回一个 ndarray 布尔值,类似于您在原始代码中构建的列表:

>>> np.in1d(arr1, arr2)
array([False, False,  True, False,  True], dtype=bool)

【讨论】:

以上是关于python中列表子集的布尔索引的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法提取发生短路的 Python 布尔值列表的索引?

如果列表包含布尔值,如何从列表中获取整数的索引?

Python Bool和int比较以及带有布尔值的列表索引

Python Bool 和 int 比较以及使用布尔值对列表进行索引

python基础篇-intstring列表元祖字典

获取布尔列表中第一个真值的索引