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)
现在我想从提取值listOfTuples
并myArray
根据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)
你已经做了最好的方法,但是如果你正在寻找一个 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)