ValueError: слишком много значений для распаковки (ожидается 1)? - PullRequest
0 голосов
/ 29 октября 2019

Я получаю " ValueError: слишком много значений для распаковки (ожидается 1) "

Это говорит об ошибке в p2, = plt.plot(t, p, 'g--', label='Approx'), но я не вижу проблемы сэта линия. Как мне это исправить?

def g(x):
    return x * np.sin(1/x)

x = np.linspace(-1, 1, 30)
y = g(x)
t = np.linspace(np.min(x), np.max(x), 100)
p = np.array([g(x) for i in range(len(t))])
xx = np.linspace(np.min(x), np.max(x), 100)
yy = g(xx)
plt.figure(1)
p1, = plt.plot(x, y, 'ro', label='Data points')
p2, = plt.plot(t, p, 'g--', label='Approx')
p3, = plt.plot(xx, yy, 'blue', label='Real')
plt.legend(handles=[p1, p2, p3], loc='best')
plt.xlabel('t')
plt.ylabel('g(x)')
plt.grid(True)
plt.show()

Ответы [ 3 ]

0 голосов
/ 29 октября 2019

Проблема в том, что ваш plt.plot(t, p, 'g--', label='Approx') состоит из 30 matplotlib.lines.Line2D объектов, но вы пытаетесь присвоить его набору длиной 1.

Если вам нужен только первый элемент из этогоplt.plot(t, p, 'g--', label='Approx') (и вам, если вам нужно, чтобы это отображалось только в легенде), просто получите первый элемент.

p2 = plt.plot(t, p, 'g--', label='Approx')[0]

Еще лучше, сделайте это для всех 3 сюжетов

0 голосов
/ 29 октября 2019

Проблема возникает из-за разницы между списками и np.array. Они ведут себя очень по-разному.

import numpy as np
import matplotlib.pyplot as plt
def g(x):
    return x * np.sin(1/x)

x = np.linspace(-1, 1, 30)
y = g(x)
t = np.linspace(np.min(x), np.max(x), 100)
a = [i for i in range(len(t))]
a = np.array(a)
p = g(a)
xx = np.linspace(np.min(x), np.max(x), 100)
yy = g(xx)
plt.figure(1)
p1, = plt.plot(x, y, 'ro', label='Data points')
p2, = plt.plot(t, p, 'g--', label='Approx')
p3, = plt.plot(xx, yy, 'blue', label='Real')
plt.legend(handles=[p1, p2, p3], loc='best')
plt.xlabel('t')
plt.ylabel('g(x)')
plt.grid(True)
plt.show()

Image Below

0 голосов
/ 29 октября 2019

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

Вторая проблема заключается в том, что t и p имеют разную длину, я не уверен, как это исправить, не зная вашей цели.

import numpy as np
import matplotlib.pyplot as plt

def g(x):
    return x * np.sin(1/x)

x = np.linspace(-1, 1, 30)
y = g(x)
t = np.linspace(np.min(x), np.max(x), 100)
p = np.array([g(x) for i in range(len(t))])[0]
xx = np.linspace(np.min(x), np.max(x), 100)
yy = g(xx)
plt.figure(1)

print('t')
print(t)
print('p')
print(p)

p1, = plt.plot(x, y, 'ro', label='Data points')
p2, = plt.plot(t, p, 'g--', label='Approx')
p3, = plt.plot(xx, yy, 'blue', label='Real')
plt.legend(handles=[p1, p2, p3], loc='best')
plt.xlabel('t')
plt.ylabel('g(x)')
plt.grid(True)
plt.show()
...