使用带有布尔表达式的数组从列表中提取值

Posted

技术标签:

【中文标题】使用带有布尔表达式的数组从列表中提取值【英文标题】:Extract values from a list using an array with boolean expressions 【发布时间】:2015-08-17 21:55:42 【问题描述】:

我有一个这样的元组列表:

listOfTuples = [(0, 1), (0, 2), (3, 1)]

还有一个看起来像这样的数组:

myArray = np.array([-2, 9, 5])

此外,我有一个带有布尔表达式的数组,我这样创建:

dummyArray = np.array([0, 1, 0.6])
myBooleanArray =  dummyArray < 1

myBooleanArray 因此看起来像这样:

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

现在我想根据myBooleanArraylistOfTuplesmyArray 中提取值。对于myArray,这是直截了当的,我可以使用:

myArray[myBooleanArray]

这给了我想要的输出

[-2  5]

但是,当我使用

listOfTuples[myBooleanArray]

我收到

TypeError:只有一个元素的整数数组可以转换为 索引

解决方法是先将此列表转换为数组:

np.array(listOfTuples)[myBooleanArray]

产生

[[0 1]
 [3 1]]

有没有更聪明的方法呢?我想要的输出是

[(0, 1), (3, 1)]

【问题讨论】:

【参考方案1】:

您已经做了最好的方法,但是如果您正在寻找 python 解决方案,您可以使用itertools.compress

>>> from itertools import compress
>>> list(compress(listOfTuples,bool_array))
[(0, 1), (3, 1)]

compress 的一个优点是它会返回一个生成器,并且如果您有大量列表,它会非常高效。因为使用生成器可以节省大量内存。

如果你想遍历结果,你不需要转换为列表。你可以这样做:

for item in compress(listOfTuples,bool_array):
     #do stuff

【讨论】:

效果很好!非常感谢您指出生成器部分,非常有帮助,因为我确实会处理大量列表!我会暂时投赞成票,稍后也会接受。【参考方案2】:

Kasra 的回答是最好的,这只是一个替代

In [30]: [i[0] for i in list(zip(listOfTuples,bools)) if i[1] == True ]
Out[30]: [(0, 1), (3, 1)]

【讨论】:

感谢您提交替代方案,即使它比 Kasra 的效率低;它工作正常!我也赞成。

以上是关于使用带有布尔表达式的数组从列表中提取值的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法可以从布尔表达式中从 pandas DataFrame 中提取行?

在 Redshift SQL 中从数组中提取值

如何从字符串中提取简单的数字表达式数字?

Oracle 使用带有 oracle regexp_substr 的正则表达式提取 json 字段

如何从字符串中提取数字并获取整数数组?

如何编写从布尔表达式查询中获取单个值的函数/触发器