1

在 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

这可以向量化为点积吗?

4

1 回答 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)
于 2013-02-10T18:45:14.870 回答