2016-02-12 4 views
1

От this post Насколько я понимаю, log10() оценивает перед оценкой where. Проще говоря, я не понимаю ответа, предоставленного в этом вопросе. Также почему сначала нужно оценить log10(), что, несомненно, приведет к ненужным вычислениям?Numpy Runtime Предупреждение: деление на ноль встречается в log10

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

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() 
+1

Вы понимаете, что вы пытаетесь вычислить 'log10 (0)', верно? – cel

+0

i can not see where, for where (condition, a, b) isnt b возвращается, если условие ложно, и если оно истинно ... – trunks1ace

ответ

2

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

np.where(return_this_logical_indexes, From_this_array_if_true, From_this_array_if_false) 

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

Вы думаете это больше как список comprenhension, как:

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

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

merge_y = np.ones_like(n) 
mask = (n > 1) 
n_m = n[mask] 
merge_y[mask] = n_m * np.log10(n_m) 

 Смежные вопросы

  • Нет связанных вопросов^_^