在我的领域中,对一些数字进行平方,一起操作它们并取结果的平方根是很常见的。这在毕达哥拉斯定理和RMS计算中完成,例如。
在numpy中,我做了以下事情:
result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))
在纯python中会出现类似的情况:
result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.
但是,我一直在使用这种纯Python形式,因为我发现它更紧凑,独立于导入,看似相同:
result = (A**2 + B**2)**0.5 # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5
我听说有些人认为**
运算符是一种黑客行为,并且通过0.5
取幂来对数字求平方不是那么可读。但我想问的是:
“有没有任何计算理由更喜欢前两种替代品而非第三种?”
感谢阅读!
答案 0 :(得分:52)
math.sqrt
是平方根的C实现,因此与使用实现Python内置**
函数的pow
运算符不同。因此,使用math.sqrt
实际上提供了与使用**
运算符不同的答案,并且确实存在计算原因而不是内置的numpy
或math
模块实现。具体而言,sqrt函数可能以最有效的方式实现,而**
在大量的基数和指数上运行,并且对于平方根的特定情况可能未被优化。另一方面,内置的pow
函数处理一些额外的情况,如“复数,无界整数幂和模幂运算”。
See this Stack Overflow question for more information on the difference between **
and math.sqrt
.
就哪个更“Pythonic”而言,我认为我们需要讨论该词的定义。从the official Python glossary开始,它指出一段代码或想法是Pythonic,如果它“严格遵循Python语言最常见的习语,而不是使用其他语言共有的概念来实现代码。”在我能想到的每一种其他语言中,都有一些带有基本平方根函数的数学模块。但是,有些语言缺少像**
这样的幂运算符,例如C ++。所以**
可能更像Pythonic,但它是否客观上更好取决于用例。
答案 1 :(得分:15)
即使在基础Python中,您也可以通用形式进行计算
result = sum(x**2 for x in some_vector) ** 0.5
x ** 2
肯定不是黑客,执行的计算是相同的(我用cpython源代码检查)。我实际上发现它更具可读性(和可读性计数)。
使用x ** 0.5
代替平方根不会执行与math.sqrt
完全相同的计算,因为前者(可能)使用对数计算,后者(可能)使用特定数字指令计算数学处理器。
我经常使用x ** 0.5
只是因为我不想为此添加math
。然而,我期望平方根的特定指令比具有对数的多步操作更好(更准确)。