#python #python-3.x #matplotlib #python-3.7
#python #python-3.x #matplotlib #python-3.7
Вопрос:
Я попытался запустить приведенный ниже код,
import math
import matplotlib.pyplot as plt
from functools import partial
def difference_quotient(f,x,h):
return(f(x h)-f(x))/h
def square(x):
return x*x
def derivative(x):
return 2*x
derivative_estimate = partial(difference_quotient,square,h=0.0001)
x = range(-10,10)
y = range(-10,10)
plt.title("actual vs estimation")
plt.plot(x,map(derivative,x),'rx',label="actual")
plt.plot(x,map(derivative_estimate,x),'b ',label="estimate")
plt.show()
print(len(list(map(derivative,x))))
но это показывает ошибку ниже
Трассировка (последний последний вызов): файл «C:Program FilesPython37libsite-packagesmatplotlibunits.py «, строка 168, в get_converter, если не np.all(xravel.mask): AttributeError: объект ‘numpy.ndarray’ не имеет атрибута ‘mask’
Во время обработки вышеупомянутого исключения возникло другое исключение:
Трассировка (последний последний вызов): файл «C:UsersasusDocumentsSublimedataSciencegradient.py «, строка 20, в plt.plot(x,map(производная,x),’rx’,label=»фактический») Файл «C:Program FilesPython37libsite-packagesmatplotlibpyplot.py «, строка 2811, на графике нет Ни одного другого {}), **kwargs) файла»C:Program FilesPython37libsite-packagesmatplotlib__init__.py «, строка 1810, во внутреннем файле функции возврата (ax, *args, **kwargs) «C:Program FilesPython37libsite-packagesmatplotlibaxes_axes.py «, строка 1611, в графике для строки вself._get_lines(* args, **kwargs): Файл «C:Program FilesPython37libsite-packagesmatplotlibaxes_base.py «, строка 393, в _grab_next_args выводится из файла self._plot_args(this, kwargs) «C:Program FilesPython37libsite-packagesmatplotlibaxes_base.py «, строка 370, в файле _plot_args x, y = self._xy_from_xy(x, y) «C:Program FilesPython37libsite-packagesmatplotlibaxes_base.py», строка 205, в файле _xy_from_xy by = self.axes.yaxis.update_units(y) «C:Program FilesPython37libsite-packagesmatplotlibaxis.py «, строка 1467, в update_units converter = munits.Файл registry.get_converter(data) «C:Program FilesPython37libsite-packagesmatplotlibunits.py «, строка 181, в get_converter конвертер = self.get_converter(next_item) Файл «C:Program FilesPython37libsite-packagesmatplotlibunits.py «, строка 187, в файле get_converter thisx = safe_first_element(x) «C:Program FilesPython37libsite-packagesmatplotlibcbook__init__.py «, строка 1635, в safe_first_element вызывает ошибку RuntimeError(«matplotlib не поддерживает генераторы » Ошибка RuntimeError: matplotlib не поддерживает генераторы в качестве входных данных [Завершено за 0.7с]
мой подозреваемый был в этой строке,
plt.plot(x,map(derivative,x),'rx',label="actual")
plt.plot(x,map(derivative_estimate,x),'b ',label="estimate")
когда я попытался изменить map(derivative, x) и map(derivative_estimate, x) на y, который равен диапазону (-10,10), это сработало.
что я должен сделать, чтобы код мог отображать график, когда я использую функцию map, как указано выше?
Комментарии:
1. пожалуйста, верните исходную трассировку. Использовать >
python /n traceback text
Ответ №1:
Вам нужно будет превратить генератор в список значений. Например. вместо map(func, values)
, используйте list(map(func, values))
. В вашем случае:
plt.plot(x, list(map(derivative,x)), 'rx', label="actual")
plt.plot(x, list(map(derivative_estimate,x)), 'b ', label="estimate")
Ответ №2:
Ошибка RuntimeError: matplotlib не поддерживает генераторы в качестве входных данных
Означает, что вы не можете использовать put в качестве аргумента что-то, называемое python generator
Вам необходимо присвоить реальные значения map(derivative,x)
и map(derivative_estimate,x)
фактическим переменным.
Попробуй это:
import math
import matplotlib.pyplot as plt
from functools import partial
def difference_quotient(f,x,h):
return(f(x h)-f(x))/h
def square(x):
return x*x
def derivative(x):
return 2*x
derivative_estimate = partial(difference_quotient,square,h=0.0001)
x = range(-10,10)
y = range(-10,10)
a = map(derivative,x)
b = map(derivative_estimate,x)
plt.title("actual vs estimation")
plt.plot(x,a,'rx',label="actual")
plt.plot(x,b,'b ',label="estimate")
plt.show()
print(len(list(map(derivative,x))))
Тем не менее, ваш код отлично работает для меня, используя python 3.4.3
и matplotlib==2.2.4
. Какую версию вы используете сами?
Комментарии:
1. python, который я использую, равен 3.7, а matplotlib == 3.0.3
2. @AriyaSusanto вы пробовали мое предложение?
3. извините за поздний ответ, я сделал, но предоставленное вами решение показывает обратную трассировку ошибки (последний последний вызов): File «C:Program FilesPython37libsite-packagesmatplotlibunits.py «, строка 168, в get_converter, если не np.all(xravel.mask): AttributeError: объект ‘numpy.ndarray’ не имеет атрибута ‘маска’