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

时间:2015-06-03 15:23:15

标签: python arrays list boolean

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

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)

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

myArray[myBooleanArray]

给了我想要的输出

[-2  5]

然而,当我使用

listOfTuples[myBooleanArray]

我收到了

  

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

解决方法是首先通过执行以下操作将此列表转换为数组:

np.array(listOfTuples)[myBooleanArray]

产生

[[0 1]
 [3 1]]

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

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

2 个答案:

答案 0 :(得分:4)

您已经采用了最佳方式,但如果您正在寻找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

答案 1 :(得分:2)

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

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