我被要求在二维数组/矩阵(行,列)中试验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中这样做的首选/惯用方法是什么?
答案 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
方法的结果不完全相同,因为它以不同的方式处理数组的边缘。)