ошибка градиентного спуска python при построении карты ()

#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’ не имеет атрибута ‘маска’