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

Cle*_*leb 5 python arrays boolean list

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

listOfTuples = [(0, 1), (0, 2), (3, 1)]
Run Code Online (Sandbox Code Playgroud)

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

myArray = np.array([-2, 9, 5])
Run Code Online (Sandbox Code Playgroud)

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

dummyArray = np.array([0, 1, 0.6])
myBooleanArray =  dummyArray < 1
Run Code Online (Sandbox Code Playgroud)

myBooleanArray 因此看起来像这样:

array([True, False, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

现在我想从提取值listOfTuplesmyArray根据myBooleanArray。因为myArray它很简单,我可以使用:

myArray[myBooleanArray]
Run Code Online (Sandbox Code Playgroud)

这给了我想要的输出

[-2  5]
Run Code Online (Sandbox Code Playgroud)

但是,当我使用

listOfTuples[myBooleanArray]
Run Code Online (Sandbox Code Playgroud)

我收到

类型错误:只有一个元素的整数数组可以转换为索引

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

np.array(listOfTuples)[myBooleanArray]
Run Code Online (Sandbox Code Playgroud)

这产生

[[0 1]
 [3 1]]
Run Code Online (Sandbox Code Playgroud)

有没有更聪明的方法来做到这一点?我想要的输出是

[(0, 1), (3, 1)]
Run Code Online (Sandbox Code Playgroud)

Kas*_*mvd 5

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

>>> from itertools import compress
>>> list(compress(listOfTuples,bool_array))
[(0, 1), (3, 1)]
Run Code Online (Sandbox Code Playgroud)

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

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

for item in compress(listOfTuples,bool_array):
     #do stuff
Run Code Online (Sandbox Code Playgroud)