[英]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.