繁体   English   中英

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

[英]Indexing an array with a logical array of the same shape in Python

我希望能够做到:

a = [1,2,3]
a[[True, True, False]]
>> array([1,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])

如果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]

您可以玩内置的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)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM