Melden Sie sich bei der Basis 2 in Python an


110

Wie soll ich das Protokoll für die Basis zwei in Python berechnen? Z.B. Ich habe diese Gleichung, in der ich Log Base 2 verwende

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

3
Was Sie haben, sollte funktionieren, wenn Sie die eckigen Klammern um die ", 2" im math.log()Anruf entfernen. Hast du es versucht?
Martineau

5
schöne Entropieberechnung
Muhammad Alkarouri

math.log (Wert, Basis)
Valentin Heinitz

Antworten:


230

Das ist gut zu wissen

Alt-Text

Sie müssen aber auch wissen, dass math.logein optionales zweites Argument erforderlich ist, mit dem Sie die Basis angeben können:

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

6
baseArgument in Version 2.3 hinzugefügt, übrigens.
Joe Koberg

9
Was ist das '?' Syntax ? Ich kann keine Referenz dafür finden.
Wap26

17
@ wap26: Oben verwende ich den interaktiven IPython- Interpreter. Eine seiner Funktionen (Zugriff mit dem ?) ist die dynamische Objektinspektion .
Unutbu

68

float → float math.log2(x)

import math

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

float → int math.frexp(x)

Wenn Sie nur den ganzzahligen Teil der Protokollbasis 2 einer Gleitkommazahl benötigen, ist das Extrahieren des Exponenten ziemlich effizient:

log2int_slow = int(math.floor(math.log(x, 2.0)))
log2int_fast = math.frexp(x)[1] - 1
  • Python frexp () ruft die C-Funktion frexp () auf, die nur den Exponenten erfasst und optimiert .

  • Python frexp () gibt ein Tupel (Mantisse, Exponent) zurück. So [1]bekommt der Exponententeil.

  • Für ganzzahlige Potenzen von 2 ist der Exponent eins mehr als Sie vielleicht erwarten. Zum Beispiel wird 32 als 0,5x2⁶ gespeichert. Dies erklärt das - 1Obige. Funktioniert auch für 1/32, das als 0,5x2⁻⁴ gespeichert ist.

  • Böden in Richtung negativer Unendlichkeit, also ist log₂31 4 nicht 5. log₂ (1/17) ist -5 nicht -4.


int → int x.bit_length()

Wenn sowohl Eingabe als auch Ausgabe Ganzzahlen sind, kann diese native Ganzzahlmethode sehr effizient sein:

log2int_faster = x.bit_length() - 1
  • - 1weil 2ⁿ n + 1 Bits benötigt. Funktioniert für sehr große ganze Zahlen, z 2**10000.

  • Böden in Richtung negativer Unendlichkeit, also ist log₂31 4 nicht 5. log₂ (1/17) ist -5 nicht -4.


1
Interessant. Sie subtrahieren dort also 1, weil die Mantisse im Bereich [0,5, 1,0] liegt? Ich würde diesem noch ein paar Gegenstimmen geben, wenn ich könnte.
LarsH

1
Genau richtig @LarsH. 32 wird als 0,5x2⁶ gespeichert. Wenn Sie also log₂32 = 5 möchten, müssen Sie 1 subtrahieren . Gilt auch für 1/32, das als 0,5x2⁻⁴ gespeichert ist.
Bob Stein

16

Wenn Sie mit Python 3.4 oder höher arbeiten, verfügt es bereits über eine integrierte Funktion zum Berechnen von log2 (x).

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

Wenn Sie eine ältere Version von Python verwenden, können Sie dies tun

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

Die Dokumentation erwähnt log2 wurde in 3.3 eingeführt. Können Sie bestätigen, dass es nur in 3.4 ist? docs.python.org/3.3/library/math.html
ZaydH

11

Verwenden von 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

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

Zusätzliche Punkte für einen Algorithmus, der angepasst werden kann, um im Gegensatz zu int (math.log (x, 2)) immer den richtigen ganzzahligen Teil anzugeben
user12861

6
>>> 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
>>> 

Dies ist in die math.logFunktion integriert. Siehe die Antwort von unutbu.
Tgray



2

In Python 3 oder höher hat die Matheklasse die folgenden Funktionen

import math

math.log2(x)
math.log10(x)
math.log1p(x)

oder Sie können im Allgemeinen math.log(x, base)für jede Basis verwenden, die Sie möchten.



0

Vergessen Sie nicht, dass log [Basis A] x = log [Basis B] x / log [Basis B] A. .

Wenn Sie also nur log(für natürliches Protokoll) und log10(für Basis-10-Protokoll) haben, können Sie verwenden

myLog2Answer = log10(myInput) / log10(2)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.