2010-09-15 7 views
73

¿Cómo debo calcular el registro en la base dos en python? P.ej. Tengo esta ecuación donde estoy usando logaritmo en base 2Inicie sesión en la base 2 en python

import math 
e = -(t/T)* math.log((t/T)[, 2]) 
+2

Lo que tienes debería funcionar si se toma los corchetes alrededor del ", 2" en la llamada 'math.log()'. ¿Lo has probado? – martineau

+3

buen cálculo de entropía –

+0

math.log (valor, base) –

Respuesta

157

Es bueno saber que

alt text

sino También sabe que math.log toma un segundo argumento opcional que le permite especificar la base:

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 
+4

+1. Fórmula de cambio de base FTW –

+2

argumento 'base' agregado en la versión 2.3, por cierto. –

+3

¿Qué es esto '?' sintaxis? No puedo encontrar referencia para eso. – wap26

1

log_base_2 (x) = log (x)/log (2)

2

logbase2 (x) = log (x)/log (2)

5
>>> 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 
>>> 
+0

Esto está integrado en la función 'math.log'. Ver la respuesta de unutbu. – tgray

+0

Tienes razón, no lo sabía, gracias;) – puzz

0

no olvide que log [base A] x = log [base B] x/log [base B] A.

Así que si sólo tiene log (por logaritmo natural) y log10 (para la base-10 log), puede utilizar

myLog2Answer = log10(myInput)/log10(2) 
7

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 
+0

Puntos extra para un algoritmo que se puede adaptar para proporcionar siempre la parte entera correcta, a diferencia de int (math.log (x, 2)) – user12861

9

Usando 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 
9

Si usted está en Python 3.4 o superior de lo que ya tiene una función integrada para el cálculo de log2 (x)

import math 
'finds log base2 of x' 
answer = math.log2(x) 

Si está en una versión anterior de python, puede hacerlo así

import math 
'finds log base2 of x' 
answer = math.log(x)/math.log(2) 
27

flotador en - flotar fuera

import math 

log2 = math.log(x, 2.0) 
log2 = math.log2(x) # python 3.4 or later 

flotador en - int cabo

Si todo lo que necesita es la parte entera del logaritmo en base 2 de un número de coma flotante, math.frexp() podría ser bastante eficiente:

log2int_slow = int(math.floor(math.log(x, 2.0))) 
log2int_fast = math.frexp(x)[1] - 1 
  • Python frexp() llama al C function frexp() que simplemente agarra y ajusta el exponente.

  • Python frexp() devuelve una tupla (mantisa, exponente). Entonces [1] obtiene la parte exponente. Para potencias integrales de 2, el exponente es uno más de lo que cabría esperar. Por ejemplo, 32 se almacena como 0.5x2⁶. Esto explica el - 1 anterior. También funciona para 1/32 que se almacena como 0.5x2⁻⁴.


int en - int cabo

Si tanto de entrada como de salida son números enteros, el método de número entero .bit_length() podría ser aún más eficiente:

log2int_faster = x.bit_length() - 1 
  • - 1 porque 2ⁿ requiere n + 1 bits. Esta es la única opción que funciona para enteros muy grandes, p. 2**10000.

  • Todas las versiones int-salida se baja el registro hacia el infinito negativo, por lo que es log₂31 4 no 5.

+1

Interesante. ¿Entonces estás restando 1 allí porque la mantisa está en el rango [0.5, 1.0)? Le daría a este uno algunos upvotes más si pudiera. – LarsH

+1

Exactamente a la derecha @LarsH. 32 se almacena como 0.5x2⁶ entonces si quiere log₂32 = 5 necesita ** restar 1 **. También es cierto para 1/32 que se almacena como 0.5x2⁻⁴. –

0

Prueba de esto,

import math 
print(math.log(8,2)) # math.log(number,base) 
Cuestiones relacionadas