【问题标题】:ValueError: too many values to unpack (expected 1)?ValueError:要解包的值太多(预期为 1)?
【发布时间】:2020-02-24 06:03:24
【问题描述】:

我不断收到“ValueError: too many values to unpack (expected 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()

【问题讨论】:

  • 看起来你正在使用 python 但你的缩进丢失了?
  • @Ryan 抱歉,我从 Python 复制粘贴,但出错了。我现在已经更正了
  • 你的代码适合我
  • 能否包含完整的回溯错误?
  • 语句p = np.array([g(x) for i in range(len(t))]) 使len(t) 复制g(x) 并创建一个二维数组。这真的是你想要的 p 吗?

标签: python numpy matplotlib error-handling


【解决方案1】:

我看到两个问题,您看到的错误是由于您的 p 变量位于单个元素列表中,因此您可以解压缩它。

第二个问题是tp 的长度不同,我不知道如何在不知道你的目标的情况下解决这个问题。

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

【讨论】:

    【解决方案2】:

    问题是您的 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 个地块都这样做

    【讨论】:

      【解决方案3】:

      由于列表和 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()
      

      【讨论】:

        猜你喜欢
        • 2014-07-31
        • 2021-12-09
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多