尝试使用 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]:
您可能需要修改以上内容才能获得您想要的,但我认为这就是您想要的路径。
