numpy数组中相邻值的加权和
在numpy数组中,最简单和最快的方法来计算加权和是什么呢?
举个例子:用欧拉方法来解决热方程。
length_l=10
time_l=10
u=zeros((length_l,length_l))# (x,y)
u[:, 0]=1
u[:,-1]=1
print(u)
def dStep(ALPHA=0.1):
for position,value in ndenumerate(u):
D2u= (u[position+(1,0)]-2*value+u[position+(-1, 0)])/(1**2) \
+(u[position+(0,1)]-2*value+u[position+( 0,-1)])/(1**2)
value+=ALPHA*D2u()
while True:
dStep()
print(u)
D2u
应该是二维的中心差分。如果我能像这样加索引:(1,4)+(1,3)=(2,7)
,那就好了。但可惜的是,python会把它们加成(1,4)+(1,3)=(1,4,1,3)
。
注意,计算D2u
相当于用一个以当前位置为中心的核进行点积运算:
0, 1, 0
1,-4, 1
0, 1, 0
这能否通过点积的方式来向量化处理呢?
1 个回答
3
我觉得你想要的是这样的:
import numpy as np
from scipy.ndimage import convolve
length_l = 10
time_l = 10
u = np.zeros((length_l, length_l))# (x,y)
u[:, 0] = 1
u[:, -1] = 1
alpha = .1
weights = np.array([[ 0, 1, 0],
[ 1, -4, 1],
[ 0, 1, 0]])
for i in range(5):
u += alpha * convolve(u, weights)
print(u)
你可以通过这样做来稍微简化一下:
weights = alpha * weights
weights[1, 1] = weights[1, 1] + 1
for i in range(5):
u = convolve(u, weights)
print(u)