Đăng nhập vào cơ sở 2 bằng python


110

Làm cách nào để tính nhật ký cho cơ sở hai trong python. Ví dụ. Tôi có phương trình này trong đó tôi đang sử dụng log cơ số 2

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

3
Những gì bạn có sẽ hoạt động nếu bạn lấy dấu ngoặc vuông ra xung quanh ", 2" trong math.log()cuộc gọi. Bạn đã thử chưa?
martineau

5
tính entropy đẹp
Muhammad Alkarouri

math.log (giá trị, cơ sở)
Valentin Heinitz

Câu trả lời:


230

Thật tốt khi biết điều đó

văn bản thay thế

nhưng cũng biết rằng math.logcó một đối số thứ hai tùy chọn cho phép bạn chỉ định cơ sở:

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
baseđối số được thêm trong phiên bản 2.3, btw.
Joe Koberg

9
Cái này là cái gì '?' cú pháp? Tôi không thể tìm thấy tài liệu tham khảo cho nó.
wap26

17
@ wap26: Ở trên, tôi đang sử dụng trình thông dịch tương tác IPython . Một trong những tính năng của nó (được truy cập với ?) là xem xét đối tượng động .
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)

Nếu tất cả những gì bạn cần là phần nguyên của log cơ số 2 của một số dấu phẩy động, thì việc trích xuất số mũ là khá hiệu quả:

log2int_slow = int(math.floor(math.log(x, 2.0)))
log2int_fast = math.frexp(x)[1] - 1
  • Python frexp () gọi hàm C frexp () , hàm này chỉ lấy và điều chỉnh số mũ.

  • Python frexp () trả về một tuple (phần định trị, số mũ). Vì vậy, [1]nhận được phần số mũ.

  • Đối với lũy thừa tích phân của 2, số mũ lớn hơn bạn có thể mong đợi. Ví dụ 32 được lưu trữ dưới dạng 0,5x2⁶. Điều này giải thích - 1ở trên. Cũng hoạt động cho 1/32 được lưu trữ dưới dạng 0,5x2⁻⁴.

  • Tầng hướng tới âm vô cùng, do đó log₂31 là 4 không phải 5. log₂ (1/17) là -5 không phải -4.


int → int x.bit_length()

Nếu cả đầu vào và đầu ra đều là số nguyên, thì phương thức số nguyên gốc này có thể rất hiệu quả:

log2int_faster = x.bit_length() - 1
  • - 1vì 2ⁿ yêu cầu n + 1 bit. Hoạt động cho các số nguyên rất lớn, ví dụ 2**10000.

  • Tầng hướng tới âm vô cùng, do đó log₂31 là 4 không phải 5. log₂ (1/17) là -5 không phải -4.


1
Hấp dẫn. Vậy bạn đang trừ 1 ở đó vì phần định trị nằm trong khoảng [0,5, 1,0)? Tôi sẽ cung cấp cho cái này một vài ủng hộ nữa nếu tôi có thể.
LarsH

1
Chính xác là đúng @LarsH. 32 được lưu trữ dưới dạng 0,5x2⁶ vì vậy nếu bạn muốn log₂32 = 5, bạn cần phải trừ đi 1 . Cũng đúng với 1/32 được lưu trữ dưới dạng 0,5x2⁻⁴.
Bob Stein

16

Nếu bạn đang sử dụng python 3.4 trở lên thì nó đã có một chức năng tích hợp để tính toán log2 (x)

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

Nếu bạn đang sử dụng phiên bản python cũ hơn thì bạn có thể làm như thế này

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

Các tài liệu đề cập đến log2 đã được giới thiệu trong 3.3. Bạn có thể xác nhận nó chỉ trong 3,4? docs.python.org/3.3/library/math.html
ZaydH

11

Sử dụng 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

Thêm điểm cho một thuật toán có thể được điều chỉnh để luôn luôn cung cấp cho các phần nguyên đúng, không giống như int (Math.log (x, 2))
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
>>> 

Điều này được tích hợp sẵn trong math.loghàm. Xem câu trả lời của unutbu.
tgray



2

Trong python 3 trở lên, lớp toán có các hàm dự phòng

import math

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

hoặc bạn thường có thể sử dụng math.log(x, base)cho bất kỳ cơ sở nào bạn muốn.



0

Đừng quên rằng log [cơ sở A] x = log [cơ sở B] x / log [cơ sở B] Một .

Vì vậy, nếu bạn chỉ có log(đối với nhật ký tự nhiên) và log10(đối với nhật ký cơ sở 10), bạn có thể sử dụng

myLog2Answer = log10(myInput) / log10(2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.