如何以安全的方式在Python中计算并且没有numpy
数字列表的几何平均值,所以我确实避免了此函数有时产生的RuntimeWarning
:
data = [1,2,3,4,5]
result = reduce(mul, data) ** (1 / len(data))
我发现我可以使用这个日志函数来获得相同的结果,但是我遇到了日志函数不接受负值的问题。
result = (1 / len(data)) * sum(list(map(math.log10, data)))
在映射到log10之前,我可以使用abs函数映射数据吗? 还有更好的办法吗?
答案 0 :(得分:1)
带负数的几何平均值没有明确定义。有几种可用的解决方法取决于您的应用程序。请参阅this以及此paper。要点是:
就代码而言,我没有遇到运行时错误(参见下面的代码)。如果您可以显示代码的示例,我可以尝试重现该代码并更新我的答案。是的,您无法将负值传递给日志,因此您必须在适当的位置采用绝对值(如上所述)。请注意,对于python 2,您必须从__future__()
模块导入除法,或者在获取分数幂时使用浮点数,否则您将得到错误的结果。
>>> data = [1,2,3,4,5]
>>> import operator
>>> result = reduce(operator.mul, data) ** (1 / len(data))
>>> result
1
>>> result = reduce(operator.mul, data) ** (1.0 / len(data))
>>> result
2.605171084697352
答案 1 :(得分:1)
通常负数的第n个根是复数
代码适用于cmath
基础e
log
,exponentiation
from functools import reduce
import operator
from cmath import log, e
data = [1,2,3,4,5]
rmul = reduce(operator.mul, data) ** (1 / len(data))
rln = e**((1 / len(data)) * sum(list(map(log, data))))
rmul, rln
Out[95]: (2.605171084697352, (2.6051710846973517+0j))
data = [1,2,3,-4,5]
rmul = reduce(operator.mul, data) ** (1 / len(data))
rln = e**((1 / len(data)) * sum(list(map(log, data))))
rmul, rln
Out[96]:
((2.1076276807743737+1.531281143283889j),
(2.1076276807743732+1.5312811432838889j))
一些检查:
abs(rln)
Out[97]: 2.6051710846973517
rln**5
Out[98]: (-120.00000000000003-1.4210854715202004e-14j)
获得更多乐趣和论点:
'正值a
的平方根不是单数,而是正数,它是+
和-
有符号值:+/- sqrt(a)
和'负a
的'平方根同样是+/- 1j * sqrt(a)
值