ошибка спуска градиента питона при построении карты () - PullRequest
2 голосов
/ 19 апреля 2019

Я попытался запустить приведенный ниже код,

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))))

, но он показывает ошибку ниже

Traceback (последний вызов был последним): Файл "C: \ Program Files \Python37 \ lib \ site-packages \ matplotlib \ units.py ", строка 168, в get_converter, если не np.all (xravel.mask): AttributeError: объект 'numpy.ndarray' не имеет атрибута 'mask'

Во время обработки вышеупомянутого исключения произошло другое исключение:

Трассировка (последний вызов был последним): файл "C: \ Users \ asus \ Documents \ Sublime \ dataScience \ градиент.py", строка 20, вplt.plot (x, map (производная, x), 'rx', label = "actual") файл "C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ pyplot.py", строка 2811, вplot не имеет значения None else {}), ** kwargs) Файл "C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib__init __. py", строка 1810, во внутренней функции возврата (ax, * args, ** kwargs)) Файл "C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ axes_axes.py", строка 1611, в сюжете для строки в self._get_lines (* args, ** kwargs): Файл "C: \ Programфайлы \ python37 \ lib \ site-packages \ matplotlib \ axes_base.py ", строка 393, в _grab_next_args - из файла self._plot_args (this, kwargs) Файл" C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ axes_base.py ", строка 370, в _plot_args x, y = self._xy_from_xy (x, y) Файл" C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ axes_base.py ", строка 205, в _xy_from_xy by =self.axes.yaxis.update_units (y) Файл "C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ axis.py", строка 1467, в update_units converter = munits.registry.get_converter (файл данных) "C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ units.py ", строка 181, в get_converter converter = self.get_converter (next_item) Файл" C: \ Program Files \ Python37 \ lib \ site-packages \matplotlib \ units.py ", строка 187, в get_converter thisx = safe_first_element (x) Файл" C: \ Program Files \ Python37 \ lib \ site-packages \ matplotlib \ cbook__init __. py ", строка 1635, в safe_first_element повышают RuntimeError ("matplotlib не поддерживает генераторы "RuntimeError: matplotlib does не поддерживает генераторы в качестве входных данных [Завершено за 0,7 с]

Мой подозреваемый был в этих строках

plt.plot(x,map(derivative,x),'rx',label="actual")
plt.plot(x,map(derivative_estimate,x),'b+',label="estimate")

, когда я пытался изменить карту (производная, x) иmap (производная_счет, х) с y, который является диапазоном (-10,10), он работает.

что мне делать, чтобы код мог показать график, когда я использую функцию карты, как описано выше?

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Вам нужно будет превратить генератор в список значений. Например. вместо 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")
0 голосов
/ 19 апреля 2019

RuntimeError: matplotlib не поддерживает генераторы в качестве входных данных

Означает, что вы не можете использовать в качестве аргумента то, что называется питоном 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. Какую версию вы используете сами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...