Python:优雅且高效的屏蔽列表的方法
Python:优雅且高效的屏蔽列表的方法
示例:
from __future__ import division import numpy as np n = 8 """掩码列表""" lst = range(n) print lst # 掩码(过滤器) msk = [(el>3) and (el<=6) for el in lst] print msk # 使用掩码 print [lst[i] for i in xrange(len(lst)) if msk[i]] """掩码数组""" ary = np.arange(n) print ary # 掩码(过滤器) msk = (ary>3)&(ary<=6) print msk # 使用掩码 print ary[msk] # 非常优雅
结果如下:
>>> [0, 1, 2, 3, 4, 5, 6, 7] [False, False, False, False, True, True, True, False] [4, 5, 6] [0 1 2 3 4 5 6 7] [False False False False True True True False] [4 5 6]
正如您所看到的,与列表相比,数组的掩码操作更加优雅。如果您尝试在列表上使用数组掩码方案,您将会得到一个错误:
>>> lst[msk] Traceback (most recent call last): File "", line 1, in TypeError: only integer arrays with one element can be converted to an index
问题是找到一种优雅的用于列表的掩码方法。
更新:
接受了jamylak
提出的compress
的答案,但是Joel Cornett
提到的要点使得解决方案符合我感兴趣的期望形式。
>>> mlist = MaskableList >>> mlist(lst)[msk] >>> [4, 5, 6]