【问题标题】:Python 3: Getting Value Error, sequence larger than 32Python 3:获取值错误,序列大于 32
【发布时间】:2020-04-15 01:11:26
【问题描述】:

我正在尝试编写一个脚本,该脚本使用前向、后向和居中近似值计算数值导数,并绘制结果。我用 100 个点制作了一个从 0 到 2pi 的 linspace。我过去做过很多数组和 linspaces,但我从未见过这个错误:“ValueError: sequence too large; cannot be greater than 32”

我不明白问题出在哪里。这是我的脚本:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.cos(x) + np.sin(x)

def f_diff(x):
    return np.cos(x) - np.sin(x)

def forward(x,h):   #forward approximation
    return (f(x+h)-f(x))/h

def backward(x,h):   #backward approximation
    return (f(x)-f(x-h))/h

def center(x,h):   #center approximation
    return (f(x+h)-f(x-h))/(2*h)

x0 = 0
x = np.linspace(0,2*np.pi,100)
forward_result = np.zeros(x)
backward_result = np.zeros(x)
center_result = np.zeros(x)
true_result = np.zeros(x)

for i in range(x):
    forward_result[i] = forward[x0,i]
    true_result[i] = f_diff[x0]

print('Forward (x0={}) = {}'.format(x0,forward(x0,x)))
#print('Backward (x0={}) = {}'.format(x0,backward(x0,dx)))
#print('Center (x0={}) = {}'.format(x0,center(x0,dx)))

plt.figure()
plt.plot(x, f)
plt.plot(x,f_diff)
plt.plot(x, abs(forward_result-true_result),label='Forward difference')

我确实尝试将 linspace 点设置为 32,但这给了我另一个错误:“TypeError: 'numpy.float64' 对象不能被解释为整数” 那个我也看不懂。我做错了什么?

【问题讨论】:

    标签: python-3.x sequence typeerror valueerror derivative


    【解决方案1】:

    问题从forward_result = np.zeros(x) 开始,因为 x 是一个 numpy 数组而不是一个维度。由于x 有 100 个条目,np.zeros 想要在 R^x[0] 乘 R^x[1] 乘 R^x[3] 等时间内创建对象。最大维度为 32。

    你需要一个扁平的 np 数组。

    更新:根据要求,我从上面的代码中添加了更正的行: forward_result = np.zeros(x.size) 创建维度为 1 的数组。

    函数的更正评估是通过圆括号完成的。还修复了循环:

    for i, h in enumerate(x):
        forward_result[i] = forward(x0,h)
        true_result[i] = f_diff(x0)
    

    最后,在图中,您要绘制 numpy 数组与函数。固定版本:

    plt.plot(x, [f(val) for val in x])
    plt.plot(x, [f_diff(val) for val in x])
    

    【讨论】:

    • 感谢您发现问题,但我该如何解决呢?我从未听说过平面 np 数组。
    • 一些解释:向量的维度为1,矩阵的维度为2。如果需要读取向量中的条目,则需要提供1个数字。读取矩阵中的条目需要两个数字(行和列索引)。您可以将过程继续到更高的维度,即当索引需要越来越多的数字时。 (该对象称为张量)。您创建了 100 维张量(它需要 100 个数字才能获得单个条目的值)。但是你需要类似矢量的对象。
    • 说真的,这些答案都没有帮助。
    • @billyyank,你的意思是上面的代码不起作用还是你不明白为什么解释?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2018-10-09
    相关资源
    最近更新 更多