在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)