2016-11-29 1 views
0

저는 Python과 Numpy에 대해 매우 익숙합니다. 그래서 여기서 분명히 분명한 점이 있다면 사과드립니다.Python Numpy 오류 : 배열 요소를 시퀀스로 설정하기

는 I 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 

을 :

ValueError: setting an array element with a sequence. 
:

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

을 ...이 오류가 발생

이 줄에 :

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

tbetafloats입니다. 나는 파이썬이 이것을 추론 할 수 없을지도 모르지만 어떻게 할 수 있을지 모르겠다. ...

당신의 도움을 위해서 미리 Thx.

+0

** ** t **가 스칼라 인 경우 **에서 **는 2x2 배열이됩니다. 이제 문제는 당신이 숫자 목록을 만들 때 할아버지가 무엇을해야 할지를 모른다는 것입니다. 배열로 셀을 채울 수 없습니다. 그런 이유로 당신은 가치 오류를 얻습니다. 저는 Physics/Maths 전공이 아니기 때문에 적절한 해결책이 어떻게 생겼는지 모르겠습니다. ** t **의 각 값에 대해 solve_ode()를 실행하는 아이디어입니까? 또는 ** ** 특정 방식으로 성장해야합니까? –

답변

1

t은 단순히 float가 아닌 linspace에서 모양이 360 인 numpy 배열로 제공됩니다. 모든 열이 동일한 길이 여야하므로 결과로 생성하려는 At 숫자 배열이 잘못 작성됩니다. 파이썬에는리스트와 numpy 배열 사이에 중요한 차이가있다. 예를 들어, 여기에있는 것을 목록의 목록으로 사용할 수 있습니다 (예 :

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

[360x 360] x [1 x 360] 크기입니다. 에서의 모든 요소 t의 길이 인 경우

달리, 어레이 형상

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

[2, 2, 360] 일 것이다.

+0

대단히 감사합니다! 어떤 바보 같은 이유 때문에, 나는 scipy가 t를 반복하고 linspace에 포함 된 모든 단일 값을 함수에 전달할 것이라고 가정했습니다. 나는 지금 이해한다, 많이 고마워! – Scrashdown

1

당신은 list 또는 listlist의의를 제공하거나,이 경우, lists의의 listlist는, 그들 모두 numpy 자동의 크기 (모양)을 추론 할 수 있도록, 동일한 길이를해야 할 때 결과 행렬.

예를 들어, 0으로 입력하는 경우를 제외하고는 모두 올바르게 입력했습니다. 당신이 예상하는 결과물이 내가 생각하기에 큐브 (cube)라고 생각하기 때문에 그것을 무엇이라고 부르는지 확실하지 않습니다.

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

을하지만 결과 배열의 .shape을 확인하고 당신이 원하는 것을 확신합니다

당신은 노호 0의 정확한 수를 제공하여 문제를 해결할 수 있습니다.

0

다른 사람들은 내부 목록에있는 0이라는 문제에 주목합니다. 다른 표현식에 의해 생성 된 360 길이 배열과 일치하지 않습니다. np.array은 그 (2x2)에서 dtype 배열을 만들 수 있지만 float을 만들 수는 없습니다.

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

은 (2,2,360) 어레이를 생성한다.그러나 나는 그 함수의 나머지 At이라고 가정 중심으로 의심 (2,2) - inv

가 반환 xt는 것은 무엇을 예상되는 등 eig과 2 차원 사각형 배열?

이 방법이 효과가 있습니까?

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

t과 같은 수의 값을 갖는 1 차원 배열을 제공합니까?

이 방법이 문제를 해결하는 가장 빠른 방법은 아니지만 가장 단순합니다. 특히 360 값만 생성하는 경우 특히 그렇습니다.

관련 문제