我有一个像这样的元组列表:
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)
现在,我想根据listOfTuples
从myArray
和myBooleanArray
中提取值。对于myArray
,它是直截了当的,我可以使用:
myArray[myBooleanArray]
给了我想要的输出
[-2 5]
然而,当我使用
时listOfTuples[myBooleanArray]
我收到了
TypeError:只有一个元素的整数数组才能转换为 索引
解决方法是首先通过执行以下操作将此列表转换为数组:
np.array(listOfTuples)[myBooleanArray]
产生
[[0 1]
[3 1]]
有没有更聪明的方法呢?我想要的输出是
[(0, 1), (3, 1)]
答案 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)]