使用Python中具有相同形状的逻辑数组索引数组

时间:2016-09-23 15:26:19

标签: python

我希望能够做到:

a = [1,2,3]
a[[True, True, False]]
>> array([1,2])

我只是找不到简单的方法......谢谢!

4 个答案:

答案 0 :(得分:2)

itertools.compress

>>> from itertools import compress
>>> a = [1,2,3]
>>> mask = [True, True, False]
>>> list(compress(a, mask))
[1, 2]

如果你正在使用 numpy ,你可以直接用面具切片:

>>> np.array(a)[np.array(mask)]
>>> array([1, 2])

答案 1 :(得分:2)

如果a和掩码是真正的Python数组,那么你可以做一个简单的列表理解:

arr = [1,2,3]
mask = [True, True, False]
[a for a, m in zip(arr, mask) if m]

如果您可以使用其他导入,则可以使用@ moses-koledoye建议使用itertools.compress

另一方面,如果你使用的是numpyarray([1,2])的最终输出显示,你可以直接进行索引:

import numpy as np
arr = np.array([1, 2, 3])
mask = np.array([True, True, False])
arr[mask]

请注意,mask必须是实际的np.boolean数组。您不能只使用像[True, True, False]这样的Python列表。这是因为np.array.__getitem__检查输入是否恰好是另一个数组。如果没有,输入将转换为整数,因此您最终会使用[1, 1, 0]而不是掩码进行有效索引。您可以在此处获得有关此特定切线问题的更多详细信息:https://stackoverflow.com/a/39168021/2988730

答案 2 :(得分:0)

您可以使用zip和列表理解。

a = [1,2,3]
b = [True, True, False]

c = [i for i,j in zip(a,b) if j]

答案 3 :(得分:0)

您可以使用内置的filtermap

k = [True, True, False, True]
l = [1,2,3,4]

print map(lambda j: j[1], filter(lambda i: i[0], zip(k,l)))