numpy 数组和“不均匀形状”有问题

pqwbnv8z  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(172)

我的代码考虑了一个三维图,但是,我需要添加依赖于“t”的“s1”,也就是说,它可以根据另一个的时间进行替换。如果不使用s1,则代码运行良好。添加“s1”时出错

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (6,) + inhomogeneous part.

字符串
我尝试了不同的解决方案,使用数组,列表,覆盖,检查内容-但这些数组中没有虚部。我在一些主题中发现回滚numpy版本有帮助,但回滚时我得到一个错误,只安装了最新版本。也许还有其他方法来解决这个问题?

import numpy as np
from scipy.integrate import odeint
import scipy.integrate as integrate
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

b = 0.5182
c = 0.22439
d = 1.465
a1 = 30
a2 = 30
eps = 0.1
s = np.random.normal(0, 1, 100000)
n = s[1]
s1 = []
for i in range(1000):
    s1.append(s[i])
as1 = np.asarray (s1)
def f(x):
    if x<=-1.2:
        f = 0.528
    if -1.2<x<1.2:
        f = x*(1-x*x)
    else:
        f = -0.528
    return f
def dH_dt(H, t=0,*s1):
        return np.array([(H[1]+s1),
                     -H[0]-b*H[1]+H[2],
                     c*(a1*f(H[0])-H[2])-d*H[1],

                     (H[4]+eps*(H[0]+H[5]))+s1,
                     -H[3]-b*H[4]+H[5],
                     c*(a2*f(H[3])-H[5])-d*H[4]])

                        
t = np.linspace(0, 100, 1000)
H0 = [0.05, 0.07, 0.09, 0.09, 0.09, 0.09]
H, infodict = integrate.odeint(dH_dt, H0, t, args=(s1,), full_output=True)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(H[:,0], H[:,1], H[:,2])
plt.show()


x1c 0d1x的数据

ctehm74n

ctehm74n1#

dH_dt函数中,H是一个numpy数组。在返回的第一个元素中,你有H[1],它的类型是np.float64s1,它是一个包含listtuple。当执行H[1] + s1时,numpy会将s1转换为numpy数组,并将H[1]的值添加到每个元素中,从而得到一个numpy数组结果。您正在创建一个返回值,其中一些元素被转换为numpy数组,而其他元素(即没有s1)的项仅为np.float64。这就产生了一个不规则的阵列,集成商不知道如何处理。
目前,我不能建议任何改变,因为我不知道你实际上想做什么。

mpgws1up

mpgws1up2#

如果我把你的函数改成更具诊断性的:

def dH_dt(H, t=0,*s1):
    ...:         alist = [(H[1]+s1),
    ...:                      -H[0]-b*H[1]+H[2],
    ...:                      c*(a1*f(H[0])-H[2])-d*H[1],
    ...: 
    ...:                      (H[4]+eps*(H[0]+H[5]))+s1,
    ...:                      -H[3]-b*H[4]+H[5],
    ...:                      c*(a2*f(H[3])-H[5])-d*H[4]]
    ...:         print([i.shape for i in alist])
    ...:         arr = np.array(alist)
    ...:         return arr

字符串
运行表明,它试图从混合的形状-标量和(1,1000)-组成一个数组

H, infodict = integrate.odeint(dH_dt, H0, t, args=(s1,), full_output=True)
[(1, 1000), (), (), (1, 1000), (), ()]


错误在行中:

arr = np.array(alist)


即使我将s1设置为标量float,也会得到列表形状为

[(1,), (), (), (1,), (), ()]


我必须将dH+dt签名更改为def dH_dt(H, t, s1):,以使其针对标量s1运行。
此函数必须返回一个与H0,(6,)形状相同的数组

`dy/dt = func(y, t, ...)`


它使用lsoda from the FORTRAN library odepacklsoda是编译过的,不能像你期望的那样从纯python/numpy代码中进行'广播'或'迭代'。它没有通常的numpy尺寸灵活性。
简而言之,您不能通过一次对该函数的调用来执行多次odeint运行。

相关问题