簡體   English   中英

Python,在numpy.array中的每個元素上應用公式

[英]Python, applying a formula on each element in an numpy.array

好吧,這就是我正在嘗試做的事情。

可以說,我對函數的輸入是(D,y)Y是數組中的元素個數,因此,如果Y為3,則數組為([1,2,3])如果是51,則數組為([1, 2,3 .... 51])。 所以我為此做的是

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

我想應用於數組的方程式如下

k = D *(T [k + 1] -T [k])+ D *(T [k-1] -T [k])

因此,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個值的數組,它將使用索引本身以及它前面/后面的一個值對每個值進行操作。

我嘗試使用int和i和“ for T中的元素”,但是它給了我永無止境的錯誤。

其次,該函數應該對端點執行不同的方程式,因為端點之前或之后沒有任何值:

T [0]的變化= D *(T [1] -T [0])

T [L-1]的變化= D *(T [L-2] -T [L-1])

我不知道如何將這些合並到函數中。

謝謝你的幫助!

您是否故意在更改T同時進行更改? 這樣一個值取決於上一步中的修改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是均勻間隔的; 我們現在就活着。

可以使用切片來一次計算中間值:

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

或者我們也可以通過以下方式獲得最終值:

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-1]進入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])

有些累積函數和無緩沖計算可能會有用

np.cumsum()
np.add.at()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM