Подтвердить что ты не робот

NumPy: логарифм с основанием n

Из документации numpy по логарифмам я нашел функции для ввода логарифма с базой e, 2 и 10:

import numpy as np
np.log(np.e**3) #3.0
np.log2(2**3)   #3.0
np.log10(10**3) #3.0

Однако, как взять логарифм с базой n (например, 42) в numpy?

4b9b3361

Ответ 1

Чтобы получить логарифм с пользовательской базой, используя math.log:

import math
number = 74088  # = 42**3
base = 42
exponent = math.log(number, base)  # = 3

Чтобы получить логарифм с пользовательской базой, используя numpy.log:

import numpy as np
array = np.array([74088, 3111696])  # = [42**3, 42**4]
base = 42
exponent = np.log(array) / np.log(base)  # = [3, 4]

Как и следовало ожидать, обратите внимание, что по умолчанию np.log(np.e) == 1.0.


Напоминаем, что правило изменения логарифмической базы:

log_b(x)=log_c(x)/log_c(b)

Ответ 2

Кажется, это тоже работает довольно хорошо (не проверено), хотя и не использует numpy:

def log_n_of_n(base, y):
    x = 1
    last_plus = x
    last_minus = x
    result = 0
    last_result = result
    step = 1

    while result != y:
        result = base**x

        if result < y:
            x += step
            if last_plus == result:
                step = step * 0.1
            last_plus = result
        else:
            x -= step
            if last_minus == result:
                step = step * 0.1
            last_minus = result

        if last_result == result or len(str(x)) > 18:
            return x + 1

        last_result = result

    return x + (1 if int(step) == 1 else 0)

# loop with an escape to exit
base = input('Enter the logrithm base:\n').strip()
while True:
    y = input('Enter the number you want to get the log of or x to exit:\n').strip()
    if y.lower() == 'x':
        break

    try:
        print (log_n_of_n(int(base), int(y)))
    except:
        print('Invalid input:', y)