我希望能够做到:
a = [1,2,3]
a[[True, True, False]]
>> array([1,2])
我只是找不到简单的方法......谢谢!
答案 0 :(得分:2)
>>> 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
。
另一方面,如果你使用的是numpy
,array([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)
您可以使用内置的filter
和map
k = [True, True, False, True]
l = [1,2,3,4]
print map(lambda j: j[1], filter(lambda i: i[0], zip(k,l)))