在NumPy中,基于邻近值计算值的惯用方法是什么?

时间:2015-10-20 10:22:16

标签: python arrays numpy vectorization

我被要求在二维数组/矩阵(行,列)中试验numpy计算值,其中这些值取决于相邻值。我承认,这不仅仅是将矩阵与标量或类似的东西相乘,即使它可以简化为一系列这样的步骤。

尽管这是家庭作业,但我的问题范围更广,而不仅仅是要求向我提出解决方案。

我已经读过numpy中的广播,即矢量化,我可以想象一种方法是将它作为新的 ufunc 实现并在矩阵上运行。但是,我有点担心我可能面临的限制 - numpy ufunc 可以访问相邻元素,而不是它在当前迭代中计算的那个吗?从概念上讲:

for x in columns:
    for y in rows:
        a[x, y] = a[x, y - 1] + a[x, y + 1] + a[x - 1, y] + a[x + 1, y] + A + B + b[x, y] # '+' is just an example of a binary op here.

意味着每个单元格中的值取决于相邻单元格,还有一些常量甚至是另一个矩阵中的值。

阅读numpy文档并没有给我带来太多帮助。在numpy中这样做的首选/惯用方法是什么?

2 个答案:

答案 0 :(得分:2)

您所描述的内容在图像处理中非常常见 - 它被称为应用内核进行二维过滤(只是为了给你一些谷歌的东西) 。来自Numpy ndimage documentation

  

本节中描述的功能都执行某种类型的功能   输入数组的空间过滤:输出中的元素是   相应的邻域中的某些值的函数   输入元素。我们将这个元素邻域称为过滤器   内核,通常是矩形的,但也可能有   任意足迹。下面介绍的许多功能都可以实现   通过传递掩码来定义内核的占用空间   足迹参数。例如,可以定义十字形内核   如下:

footprint = array([[0,1,0],[1,1,1],[0,1,0]])
footprint array([[0, 1, 0],
                 [1, 1, 1],
                 [0, 1, 0]])

您接下来要做的是使用convolve function

from scipy import ndimage
output = ndimage.convolve(matrix, footprint)

如果你想"包装"类似于xnx's answer的行为,使用mode="wrap"参数convolve

output = ndimage.convolve(matrix, footprint, mode="wrap")

答案 1 :(得分:2)

在简单的情况下,适当地切片阵列可能会有所帮助。例如,要将数组a中的相邻列和行添加到输出数组B

In [5]: B = a.copy()
In [6]: B[1:,:] += a[:-1,:]
In [7]: B[:-1,:] += a[1:,:]
In [8]: B[:,1:] += a[:,:-1]
In [9]: B[:,:-1] += a[:,1:]

(这与其他答案中建议的convolve方法的结果不完全相同,因为它以不同的方式处理数组的边缘。)