【问题标题】: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)]

【问题讨论】:

    标签: python arrays list boolean


    【解决方案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 的效率低;它工作正常!我也赞成。
    猜你喜欢
    • 2012-12-05
    • 2017-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多