使用带有布尔表达式的数组从列表中提取值
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)
现在我想根据myBooleanArray
从listOfTuples
和myArray
中提取值。对于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 中提取行?