[英]Indexing an array with a logical array of the same shape in Python
我希望能够做到:
a = [1,2,3]
a[[True, True, False]]
>> array([1,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])
如果a
和mask是真正的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
您可以使用zip
和列表理解。
a = [1,2,3]
b = [True, True, False]
c = [i for i,j in zip(a,b) if j]
您可以玩内置的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)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.