在Python中login到基地2
我应该如何计算日志到python的基础二。 例如。 我有这个等式,我在使用日志库2
import math e = -(t/T)* math.log((t/T)[, 2])
很高兴知道这一点
但也知道math.log
采取可选的第二个参数,它允许你指定基地:
In [22]: import math In [23]: math.log? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in function log> Namespace: Interactive Docstring: log(x[, base]) -> the logarithm of x to the given base. If the base not specified, returns the natural logarithm (base e) of x. In [25]: math.log(8,2) Out[25]: 3.0
如果你所需要的只是日志库2的整数部分 , math.frexp()
可能是非常有效的:
import math log2int_slow = int(math.floor(math.log(x, 2.0))) log2int_fast = math.frexp(x)[1]-1
它调用的C函数只是抓取和调整指数。
Splainin: frexp()返回一个元组(尾数,指数)。 所以[1]
得到指数部分。 对于2的整数幂,指数比你想象的多一个。 例如32被存储为0.5×2。 这解释了上面的-1
。 也适用于存储为0.5×2 – 4的1/32。
如果input和输出都是整数,整数方法.bit_length()
可能更有效:
log2int_faster = int(x).bit_length()-1
-1
因为2ⁿ需要n + 1位。 这是唯一的选项,适用于非常大的整数,例如2**10000
。
所有这些选项都可以使得对数无穷大,所以log231是4而不是5。
使用numpy:
In [1]: import numpy as np In [2]: np.log2? Type: function Base Class: <type 'function'> String Form: <function log2 at 0x03049030> Namespace: Interactive File: c:\python26\lib\site-packages\numpy\lib\ufunclike.py Definition: np.log2(x, y=None) Docstring: Return the base 2 logarithm of the input array, element-wise. Parameters ---------- x : array_like Input array. y : array_like Optional output array with the same shape as `x`. Returns ------- y : ndarray The logarithm to the base 2 of `x` element-wise. NaNs are returned where `x` is negative. See Also -------- log, log1p, log10 Examples -------- >>> np.log2([-1, 2, 4]) array([ NaN, 1., 2.]) In [3]: np.log2(8) Out[3]: 3.0
http://en.wikipedia.org/wiki/Binary_logarithm
def lg(x, tol=1e-13): res = 0.0 # Integer part while x<1: res -= 1 x *= 2 while x>=2: res += 1 x /= 2 # Fractional part fp = 1.0 while fp>=tol: fp /= 2 x *= x if x >= 2: x /= 2 res += fp return res
如果你是Python 3.4或以上版本,那么它已经有一个内置函数来计算log2(x)
import math 'finds log base2 of x' answer = math.log2(x)
如果你是在较旧版本的Python,那么你可以这样做
import math 'finds log base2 of x' answer = math.log(x)/math.log(2)
>>> def log2( x ): ... return math.log( x ) / math.log( 2 ) ... >>> log2( 2 ) 1.0 >>> log2( 4 ) 2.0 >>> log2( 8 ) 3.0 >>> log2( 2.4 ) 1.2630344058337937 >>>
logbase2(x)= log(x)/ log(2)
log_base_2(x)= log(x)/ log(2)
不要忘记log [base A] x = log [base B] x / log [base B] A。
所以如果你只有log
(对于自然日志)和log10
(对于基本的10日志),你可以使用
myLog2Answer = log10(myInput) / log10(2)