numpy数组中相邻值的加权和

1 投票
1 回答
1012 浏览
提问于 2025-04-17 15:25

在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)

撰写回答