首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继续获取值错误:使用序列设置数组元素,但不确定原因

继续获取值错误:使用序列设置数组元素,但不确定原因
EN

Stack Overflow用户
提问于 2022-09-25 19:14:24
回答 2查看 103关注 0票数 0

当我试图将最后一步添加到数组xi+1=时,我一直得到一个值错误.我在这里做错什么了?使用类似的代码分配数组,之前没有问题。我们很感谢你的帮助。

源代码:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
#parameters
sigma=10.
rho=28.
beta=8/3.
ti=0.
tf=100
dt=0.01
#pre-allocation
x = np.zeros(tf)
y = np.zeros(tf)
z = np.zeros(tf)
#initial conditions
x[0]=1.
y[0]=1.
z[0]=1.
#functions
fx= lambda x: sigma*(y-x)  #y too?
fy= lambda y: x*(rho-z)-y
fz= lambda z: x*y-(beta*z)
#euler-richardson
for i in np.arange(0,tf-1):
    k1_x = fx(x[i])
    k1_y = fy(y[i])
    k1_z = fz(z[i])
    
    k2_x = fx((x[i]+(0.5*k1_x))*dt)  #maybe just dt?
    k2_y = fy((y[i]+(0.5*k1_y))*dt)
    k2_z = fz((z[i]+(0.5*k1_z))*dt)
    
    x[i+1] = x[i] + k2_x
    y[i+1] = y[i] + k2_y
    z[i+1] = z[i] + k2_z

错误:

代码语言:javascript
复制
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    TypeError: only size-1 arrays can be converted to Python scalars

    The above exception was the direct cause of the following exception:

    ValueError                                Traceback (most recent call last)
    Input In [10], in <cell line: 2>()
          8 k2_y = fy((y[i]+(0.5*k1_y))*dt)
          9 k2_z = fz((z[i]+(0.5*k1_z))*dt)
    ---> 11 x[i+1] = x[i] + k2_x
         12 y[i+1] = y[i] + k2_y
         13 z[i+1] = z[i] + k2_z

    ValueError: setting an array element with a sequence.
EN

回答 2

Stack Overflow用户

发布于 2022-09-25 19:34:03

防止此错误所需的步骤:

解决这个问题的最简单的方法是使用支持所有类型的data-type.

  • Second的数据类型,解决这个问题的方法是匹配数组的默认数据类型和赋值。

您需要将数组的dtype作为对象传递,因为数组中的元素必须具有相同的dtype,而在列表中则可以有不同的dtype。它会正常工作,我已经运行了您的代码,您只需要更改以下行

代码语言:javascript
复制
#pre-allocation
x = np.zeros(tf, dtype=object)
y = np.zeros(tf, dtype=object)
z = np.zeros(tf, dtype=object)

这个solution很有用。

票数 0
EN

Stack Overflow用户

发布于 2022-09-25 19:35:12

让我们在IPython中试一试,看看会发生什么:

代码语言:javascript
复制
In [1]: import numpy as np

In [2]: sigma=10.
   ...: rho=28.
   ...: beta=8/3.
   ...: ti=0.
   ...: tf=100
   ...: dt=0.01
   ...: #pre-allocation
   ...: x = np.zeros(tf)
   ...: y = np.zeros(tf)
   ...: z = np.zeros(tf);

In [3]: #initial conditions
   ...: x[0]=1.
   ...: y[0]=1.
   ...: z[0]=1.

In [5]: # functions
   ...: fx= lambda x: sigma*(y-x)
   ...: fy= lambda y: x*(rho-z)-y
   ...: fz= lambda z: x*y-(beta*z);
Out[5]: 

就我个人而言,我觉得xyz作为全局名称和函数参数的用法令人费解。

现在我们把你的一个功能叫做:

代码语言:javascript
复制
In [6]: fx(x[4])
Out[6]: 
array([10.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

您的函数只有一个参数。这意味着它们将从调用它们的上下文中使用其他引用对象。

在本例中,这些是numpy数组xyz。因此,数组的返回值。

有效地说,fx(x[4])与以下内容相同:

代码语言:javascript
复制
In [10]: sigma*(y-x[4])
Out[10]: 
array([10.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73847216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档