Python Numpy错误:使用序列设置数组元素

时间:2016-11-29 10:21:42

标签: python numpy

我对Python和Numpy很陌生,所以如果我在这里遗漏了一些明显的东西,我会道歉。

我有一个函数可以解决一个由2个微分方程组成的系统:

import numpy as np
import numpy.linalg as la

def solve_ode(x0, a0, beta, t):
    At = np.array([[0.23*t, (-10**5)*t], [0, -beta*t]], dtype=np.float32)

    # get eigenvalues and eigenvectors
    evals, V = la.eig(At)
    Vi = la.inv(V)

    # get e^At coeff
    eAt = V @ np.exp(evals) @ Vi

    xt = eAt*x0
    return xt

但是,使用以下代码运行它:

import matplotlib.pyplot as plt

# initial values
x0 = 10**6
a0 = 2.5
beta = 0.05

t = np.linspace(0, 3600, 360)

plt.semilogy(t, solve_ode(x0, a0, beta, t))

...抛出此错误:

ValueError: setting an array element with a sequence.

在这一行:

At = np.array([[0.23*t, (-10**5)*t], [0, -beta*t]], dtype=np.float32)

请注意,tbeta应为floats。我认为Python可能无法推断出这一点,但我不知道如何做到这一点......

提前帮助你。

3 个答案:

答案 0 :(得分:1)

您正在从linspace提供t作为形状360的numpy数组而不仅仅是一个浮点数。由于所有列的长度必须相同,因此您尝试创建的At numpy数组生成错误。在python中,列表和numpy数组之间存在重要差异。例如,您可以在此处作为列表列表执行操作,例如

At = [[0.23*t, (-10**5)*t], [0, -beta*t]]

尺寸[[360 x 360] x [1 x 360]]。

或者,如果At的所有元素都是t数组的长度,

At = np.array([[0.23*t, (-10**5)*t], [t, -beta*t]], dtype=np.float32)

形状[2,2,360]。

答案 1 :(得分:1)

当您提供listlist list时,或者在这种情况下,list list lists s,所有这些都应该具有相同的长度,以便numpy可以自动推断出结果矩阵的维度(形状)。

在您的示例中,除了您将0作为放置的部分之外,它都被正确放置了。不知道该怎么称呼它,因为我想你的预期输出是一个立方体。

您可以通过提供正确数量的零来修复它:

At = np.array([[0.23*t, (-10**5)*t], [np.zeros(len(t)), -beta*t]], dtype=np.float32)

但请检查生成的数组的.shape,并确保它符合您的要求。

答案 2 :(得分:0)

其他人注意到问题是内部列表中的0。它与其他表达式生成的360长度数组不匹配。 np.array可以从那个(2x2)创建一个对象dtype数组,但不能创建一个浮点数。

At = np.array([[0.23*t, (-10**5)*t], [0*t, -beta*t]])

产生一个(2,2,360)阵列。但我怀疑该函数的其余部分是围绕At是(2,2) - 带有eiginv等的2d方阵的假设而构建的。

应该是什么回报xt

这有用吗?

S = np.array([solve_ode(x0, a0, beta, i) for i in t])

为1d数组提供与t中相同数量的值?

我并不是说这是解决问题的最快方法,但它是最简单的,特别是如果你只生成360值。