Numpy RuntimeWarning: деление на ноль, встречающееся в log10

Из этого поста я понимаю, что log10 () вычисляется до оценки where. Проще говоря, я не понимаю ответ, предоставленный в этом вопросе. Кроме того, зачем сначала оценивать log10 (), что, безусловно, приводит к ненужным вычислениям?

merge_y = np.where (n <= 1, 1, n * np.log10 (n))

import matplotlib.pyplot as plt
import numpy as np

n = np.arange(0, 10, 0.0001)

merge_y = np.where(n <= 1, 1, n * np.log10(n))
insertion_y = n*n

plt.plot(n, merge_y,'g')
plt.plot(n,insertion_y,'r')
plt.grid(True)
plt.xlabel('n')
plt.ylabel('T(n)')
plt.title('Time complexities of merge and insertion sort w/ input size n')
plt.show()

2 ответа

Решение

Вы должны понимать, что np.where работает на основе логического индексирования, вы думаете об этом как цикл. Какие np.where делает это

np.where(return_this_logical_indexes, From_this_array_if_true, From_this_array_if_false)

Но для того, чтобы сделать это, эти массивы должны существовать, если это функция, тогда она будет оценивать ее, чтобы получить массив, а затем проиндексировать его с помощью логического массива, созданного условием.

Вы думаете, это больше похоже на составление списка, например:

merge_y = [x*np.log10(x) if x>=1 else 1 for x in n]

Почему бы не сделать:

merge_y = np.ones_like(n)
mask = (n > 1)
n_m = n[mask]
merge_y[mask] = n_m * np.log10(n_m)
Другие вопросы по тегам