gpt4 book ai didi

Python:屏蔽列表的优雅而有效的方法

转载 作者:太空狗 更新时间:2023-10-29 17:10:14 26 4
gpt4 key购买 nike

示例:

from __future__ import division
import numpy as np

n = 8
"""masking lists"""
lst = range(n)
print lst

# the mask (filter)
msk = [(el>3) and (el<=6) for el in lst]
print msk

# use of the mask
print [lst[i] for i in xrange(len(lst)) if msk[i]]

"""masking arrays"""
ary = np.arange(n)
print ary

# the mask (filter)
msk = (ary>3)&(ary<=6)
print msk

# use of the mask
print ary[msk] # very elegant

结果是:

>>> 
[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 "<interactive input>", line 1, in <module>
TypeError: only integer arrays with one element can be converted to an index

问题是为 list 找到一个优雅的掩码。

更新:
jamylak 的回答因引入 compress 而被接受,但是 Joel Cornett 提到的要点使解决方案完整到我感兴趣的所需形式。

>>> mlist = MaskableList
>>> mlist(lst)[msk]
>>> [4, 5, 6]

最佳答案

如果您使用的是 numpy:

>>> import numpy as np
>>> a = np.arange(8)
>>> mask = np.array([False, False, False, False, True, True, True, False], dtype=np.bool)
>>> a[mask]
array([4, 5, 6])

如果你没有使用 numpy,你正在寻找 itertools.compress

>>> from itertools import compress
>>> a = range(8)
>>> mask = [False, False, False, False, True, True, True, False]
>>> list(compress(a, mask))
[4, 5, 6]

关于Python:屏蔽列表的优雅而有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10274774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com