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])
Soumya
quelle
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
unutbu
quelle
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.

Bob Stein
quelle
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)
Akashchandrakar
quelle
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
Riza
quelle
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
log0
quelle
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
>>> 
Puzzle
quelle
Dies ist in die math.logFunktion integriert. Siehe die Antwort von unutbu.
Tgray
3

Versuche dies ,

import math
print(math.log(8,2))  # math.log(number,base) 
Akash Kandpal
quelle
2

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

Conor
quelle
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.

Masoud Mustamandi
quelle
1

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

Alexandre C.
quelle
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)
Platinum Azure
quelle