2016-05-23 10 views
-2

私は宇宙論を研究していますが、最近は数値シミュレーションの経験がありました。新しい配列を定義する際の値エラー

私はC++での経験がありますが、私はPythonを使い始めました。

以下は現在作成しているPythonコードの一部です。ライン "SD = np.array([])(L、1)再構築" のために

def energy(s): 
    def spectrum(s): 
     phi = sol[s,:] 
     N = len(phi) 
     return 2.0/N * np.real(np.fft.rfft(phi)) 
    delta_t = t_array[1] - t_array[0] 
    sp = spectrum(s) 
    spb = spectrum(s-1) 
    spa = spectrum(s+1) 
    L = len(sp) 
    def spectrum_dot(s): 
     sD = np.array([]).reshape(1,L) 
     for j in range(0,L): 
     sD[j] = (spa[j] - spb[j])/(2 * delta_t) 
     return sD 
    sd = spectrum_dot(s) 
    E = np.array([]).reshape(1,L) 
    for i in range(0,L): 
    E[i] = (sd[i]*sd[i]/2) + (sp[i]*sp[i]*(i*math.pi/128)*(i*math.pi/128)/2) + V(sp[i]) 
    return E 

f_l = energy(time_steps * 128/619) 
plt.plot(f_l[1:200]) 
plt.axhline(0,color='black',linewidth=0.6) 
plt.axis([0,200,-1,1]) 
plt.savefig('128.png') 

、私が言うとValueError取得しています "とValueErrorを:新しい配列の合計サイズが変わらなければなりません"。

"spectrum_dot(s)"のリターン配列を定義することは問題であるようです。

このエラーを解決するヒントを教えてください。

ありがとうございます。

+1

pythonコードを投稿する際にインデントを正しく書き換えるようにしてください。ひどくインデントされたPythonコードはナンセンスです。 – khelwood

+0

ありがとうございます。私はインデントを訂正しました。 – flaton

+1

空の配列の形状を変更しようとしています。元の配列は形状(0、)を持っているので、長さ 'L'の何かにシェイプすることができなくなります。 'np.array([0] * L).reshape(1、L)'のようなものがうまくいくでしょう。np.zeros((1,3)) – JCVanHamme

答えて

0

あなたはあなたのコードに2つの問題を抱えているが、最初は.reshape()の方法は、そのデータの配列のサイズ(または配列のアドレス、データ)だけ形状を変更できないということです

# legal 
z1 = np.zeros(20) 
z1.reshape((4,5)) 
# illegal 
z1.reshape((5,5)) 

もう一つの問題は私も持っているfortran/cの背景ですので、私はあなたの問題を理解することができます... numpyを使用すると、になるはずです。むしろベクトル式を書くその値は、あなたが、明示的なループとは、最も重要なsD、ノー指標の

sD = (sda-sdb)/2/delta_t 

何の初期化コードに戻っていない、それに名前を割り当てる場合は、後で再利用できる別の配列であります暗黙のループは、コンパイルされた言語に匹敵する速度で実行されます。つまり、Pythonの明示的なループよりも速い順番です。配列式を扱うときnumpyは以下の

ルールは放送ルールとして知られており、あなたが真剣にこのライブラリを使用するつもりなら、あなたはは時々少しあなたが書くことができますを(放送を理解する必要がありますたとえこれがこの例では当てはまらない場合でも)、明示的なループのオーバーロードを避けるための式です。

+0

種類の説明ありがとうございます。私はたくさんのことを学んだ。 – flaton

+0

ありがとうございます。 – gboffi

関連する問題