Skip to main content
 首页 » 编程设计

python之如何使用 NumPy 数组算术 Python 对有限差分法进行矢量化

2025年05月04日12telwanggs

尝试使用 Numpy 算法对 numpy 值数组(不包括边值)的有限差分法进行矢量化。应该取周围值(顶部、底部、左侧、右侧)的平均值来计算它。

例如,应该能够像这样获取一个 numpy 数组:

u = np.array([[100., 100., 100., 100., 100.], 
             [100.,  0.,    0.,   0.,  100.], 
             [100.,  0.,    0.,   0., 100.], 
             [100.,  0.,    0.,   0., 100.], 
             [100., 100., 100., 100., 100.]]) 

并返回:

[[100. 100. 100. 100. 100.] 
[100.  50.  25.  50. 100.] 
[100.  25.   0.  25. 100.] 
[100.  50.  25.  50. 100.] 
[100. 100. 100. 100. 100.]] 

已经可以使用 for-loops,但效率很低。数组大小和值可能会有所不同。

到目前为止,我一直在尝试使用子数组对解决方案进行矢量化处理,但一直无法弄清楚如何让它发挥作用:

import numpy as np 
 
#example array 
x = np.array([[100.,   2.,   3.,   7., 100.], 
              [100.,   5.,   3.,   7., 100.], 
              [100.,   3.,   6.,   3., 100.], 
              [50.,   4.,   5.,   2., 100.], 
              [100., 100., 100., 100., 100.]]) 
 
lbarrier = (np.size(x, 1))+1 
rbarrier = (np.size(x, 1))-1 
bbarrier = (np.size(x, 0))-1 
 
 
 
 
#inner vals 
itops = x[0:bbarrier][1:rbarrier][0][1:rbarrier] 
ibot = x[0:bbarrier][1:rbarrier][-1][1:rbarrier] 
ileft = x[1:bbarrier,1] 
iright = x[1:bbarrier,-2] 
 
 
 
#edge vals 
etops = np.array(x[0:][0:][0][1:-1]) 
ebot = np.array(x[0:][0:][-1][1:-1]) 
eleft = np.array(x[1:bbarrier, 0]) 
eright = np.array(x[1:bbarrier, -1]) 

如有任何帮助,我们将不胜感激。

请您参考如下方法:

这种类型的操作在图像处理中很常见。您正在使用“内核”“卷积”矩阵。 scipy 有 ndimage 可以做到这一点。看起来您已经用边缘值 100 填充了内部矩阵。所以这适用于内部部分:

In [49]: from scipy import ndimage                                               
 
In [50]: import numpy as np                                                      
 
In [51]: k                                                                       
Out[51]:  
array([[0.  , 0.25, 0.  ], 
       [0.25, 0.  , 0.25], 
       [0.  , 0.25, 0.  ]]) 
 
In [52]: u = np.zeros((3,3))                                                     
 
In [53]: ndimage.convolve(u, k, mode='constant', cval=100.0)                     
Out[53]:  
array([[50., 25., 50.], 
       [25.,  0., 25.], 
       [50., 25., 50.]]) 
 
In [54]:       

您可能需要修改以上内容才能获得您想要的,但我认为这就是您想要的路径。