Простое построение функции журнала в python - PullRequest
0 голосов
/ 30 января 2019

Я написал простую функцию для построения журнала в Python:

import matplotlib.pyplot as plt
import numpy as np

x = list(range(1, 10000, 1))
y = [-np.log(p/10000) for p in x]

plt.scatter(x, y) # also tried with plt.plot(x, y)

plt.show()

Я просто хочу посмотреть, как выглядит график.

fn.py:5: RuntimeWarning: divide by zero encountered in log
  y = [-np.log(p/10000) for p in x]

Я получаю вышеуказанную ошибку и сверхуиз этого я получаю пустой график с неправильными даже диапазонами.

Странно, почему появляется предупреждение divide by zero, когда я делю на число?

Как правильно построить графикфункционировать?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Зачем импортировать NumPy, а затем избегать его использования?Вы могли бы просто сделать:

from math import log
import matplotlib.pyplot as plt

x = xrange(1, 10000)
y = [-log(p / 10000.0) for p in x]

plt.scatter(x, y)
plt.show()

Если вы собираетесь привнести в картину ничего не значащую, подумайте о том, чтобы делать что-то похожее на нюанс:

import matplotlib.pyplot as plt
import numpy as np

f = lambda p: -np.log(p / 10000.0)
x = np.arange(1, 10000)

plt.scatter(x, f(x))
plt.show()
0 голосов
/ 30 января 2019

Хотя вы пометили python-3.x, похоже, что вы используете python-2.x, где p/10000 приведет к 0 для значений p < 10000, потому что оператор деления / выполняет целочисленное деление в python-2.x. Если это так , вы можете явно использовать 10000.0 вместо 10000, чтобы избежать этого и получить деление с плавающей точкой.

Использование .0 не требуется в python 3+потому что по умолчанию он выполняет деление поплавка.Следовательно, ваш код отлично работает в python 3.6.5, хотя

import matplotlib.pyplot as plt
import numpy as np

x = list(range(1, 10000, 1))
y = [-np.log(p/10000.0) for p in x]

plt.scatter(x, y)
plt.show()

enter image description here

С другой стороны: вы можете просто использовать NumPy's arange для генерацииx и полностью избегайте list и используйте векторизованную операцию.

x = np.arange(1, 10000)
y = -np.log(x/10000.0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...