2016-03-28 16 views
1

さて、これが何をしようとしているのですか?Pythonでnumpy.arrayの各要素に数式を適用する

私の入力は(D、y) Yは配列内のいくつの要素なので、Yが3の場合は配列が([1,2,3])、51ならば配列([1,2,3 ... 51])です。 ので、このために行うイム= D *(T [K + 1] -T [K])+ D

K以下れる

def okay(D,y): 
    T=np.arange(y) 

iは、アレイに適用する方程式ものですしたがって、kはT配列内の任意のインデックスであり、Dは関数の先頭で指定された値である。

基本的に何が起こっているのかは、操作後の配列の任意の要素の新しい値がD *([要素の前の要素] - [要素自体])+ D *([それ以前のエレメンツ - [要素そのもの])

だから、これは一般に簡単なようです。私は私が試してみて、エリア内のすべての単一の要素のためにこれを行う機能を作るたび

d=3 
T=np.array([23,17,46,2]) 
T[1] = d*(T[2]-T[1])+d*(T[0]-T[1]) 
print(T) 

は、しかし、私の問題が表示され、個々のインデックスを指定することで、単純な配列でそれを行うことができました。 k面をどのように設定するかを理解することはできません。つまり、関数は配列の任意の点を意味すると理解しています。だから、私は5000の値の配列を持っている場合、それは、インデックス自体を使用して、それぞれの操作を行い、infront /背後にある。

私はintとiと "for element in T"を使ってみましたが、決してエラーを終了しません。それらは前またはそれらの後に任意の値を持っていけないので

第二に、機能は、エンドポイントの異なる式を実行する必要があります。

Tの変化[0] = D *(T [1] -T [0] )

Tの変化[L-1] = D *(T [L-2] -T [L-1])

Iは、関数にこれらを組み込む方法がわかりません。

ありがとうございました!

+0

np.cumsum() np.add.at() 
T [1] = D *(T [2] -T [1])+ D *(T [0] -T [1] ) これはT [1]値を変更し、T [2]が計算されるときに変更された値が使用されます。それはあなたが欲しいものですか? – Hun

+0

ループを作成し、結果の配列要素を要素ごとに構築してください。このループの中で、2つの特別なケース(エンドポイント)を追加してください。 –

+0

スライス、 'T [1:]'、 'T [ - - 1]'などでほとんどの値を計算してみてください。 – hpaulj

答えて

0

あなたは意図的にTを変更していますか?したがって、1つの値は前の手順の変更されたTに依存しますか?または、それぞれのステップは独立していますか?

より簡単なので、後者を仮定します。私たちは、私が考えるその場合には、計算:

In [528]: T = np.arange(10) 
In [529]: R = np.zeros(10) 
In [533]: for i in range(10): 
    if i==0: 
     R[i]=3*(T[i+1]-T[i]) 
    elif i==9: 
     R[i]=2*(T[i-1]-T[i]) 
    else: 
     R[i]=3*(T[i+1]-T[i])+2*(T[i-1]-T[i]) 
    .....:   
In [534]: R 
Out[534]: array([ 3., 1., 1., 1., 1., 1., 1., 1., 1., -2.]) 

真ん中の値がTが等間隔であるため、非常に興味深いではありません。私たちは今それを生きるでしょう。

真ん中の値がスライスを使用して、1で全て計算できます

In [535]: 3*(T[2:]-T[1:-1])+2*(T[:-2]-T[1:-1]) 
Out[535]: array([1, 1, 1, 1, 1, 1, 1, 1]) 
In [536]: R[1:-1]=3*(T[2:]-T[1:-1])+2*(T[:-2]-T[1:-1]) 
In [537]: R 
Out[537]: array([ 3., 1., 1., 1., 1., 1., 1., 1., 1., -2.]) 

それとも我々が同様に終了値を取得することができます:の計算にR[i-1]入ると

In [542]: R = np.zeros(10) 
In [543]: R[:-1] += 3*(T[1:]-T[:-1]) 
In [544]: R[1:] += 2*(T[:-1]-T[1:]) 
In [545]: R 
Out[545]: array([ 3., 1., 1., 1., 1., 1., 1., 1., 1., -2.]) 

R[i]では、ベクトル化された計算を再考する必要があります:

In [546]: R = T.copy() 
In [547]: for i in range(10): 
    if i==0: 
     R[i]=3*(T[i+1]-T[i]) 
    elif i==9: 
     R[i]=2*(R[i-1]-T[i]) 
    else: 
     R[i]=3*(T[i+1]-T[i])+2*(R[i-1]-T[i]) 
    .....:   
In [548]: R 
Out[548]: array([ 3, 7, 13, 23, 41, 75, 141, 271, 529, 1040]) 

有用かもしれないいくつかの累積関数とバッファなし計算があり

関連する問題