我想知道是否有更简洁的方法来执行以下操作:
当h
、t
、r
是numpy数组时,我想做如下操作:
hL, tL, rL = map(lambda m: len(set(m)), [h, t, r])
计算单个数组中非重复项的数量。但是,lambda 表达式像拇指一样突出。如果不重复的事情不是问题,我会写:
hL, tL, rL = map(len, [h, t, r])
这太酷了。我们已经完全放弃了 lambda 表达式。接触 Haskell 几个月后,我真的开始相信 Python 应该能够在 Haskell 中提供像 .
这样的链接运算符,以便第一个表达式可以简单地简化为以下内容:
hL, tL, rL = map(len . set, [h, t, r])
哪个更好!!
我看到一些使用 reduce
方法来执行此操作的东西,但这比以前的方法更难看。我想知道是否有人知道可以解决问题的东西?我知道非严格评估存在一些问题,可能会使程序不稳定,但是当我们处理像这样的简单事情时,这不应该成为问题吗?
最佳答案
要计算 numpy 数组中唯一元素的数量,您可以使用 unique(x).size
或 len(unique(x))
(参见 numpy.unique
) .如果你真的想让三个长度的计算成为“一行”,你可以这样写:
hL, tL, rL = [len(unique(x)) for x in h, t, r]
以防万一:对于中型到大型数组,unique(x)
可能比 set(x)
快很多,但对于小型数组,set(x)
更快。 (我还没有探索各种数组大小和数据类型的性能,所以我将保留“大”和“小”未定义。自己测试——但前提是这段代码是性能瓶颈。)
关于python - 更改 map 表达式中的功能的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21396407/