【问题标题】:What is the idiomatic way to compute values based on neighboring values, in NumPy?在 NumPy 中,根据相邻值计算值的惯用方法是什么?
【发布时间】:2015-10-20 10:22:15
【问题描述】:

我被要求在二维数组/矩阵(行、列)中尝试 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 中执行此操作的首选/惯用方式是什么?

【问题讨论】:

  • 投票结束此问题的人,请提供理由,否则我不知道出了什么问题,而且我的下一个类似风格的问题很有可能也会获得接近投票,依此类推。
  • 我唯一能发现这个问题“不好”的地方是你写的过于详尽的散文——我的建议是尽量减少你提到的所有“与问题无关”的事实,但随后再次,我完全赞成人们提及目标和背景。恕我直言,您的文字只是有点太重复,但又不是太宽泛

标签: python arrays numpy vectorization


【解决方案1】:

在简单的情况下,适当地对数组进行切片可能会对您有所帮助。例如,将数组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 方法的结果并不完全相同,因为它以不同的方式处理数组的边缘。)

【讨论】:

  • 编辑了我的答案; mode="wrap" 正是这样做的 :)
【解决方案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")

【讨论】:

  • 谢谢。我不确定我可以使用scipy,而且我什至没有安装它。我确实有numpy。是否可以在没有 SciPy 的情况下进行卷积并应用内核?我查过了,numpy 中有一个convolve()。看来scipynumpy之间的关系也不是很明确。
猜你喜欢
  • 2018-03-06
  • 2019-07-23
  • 2018-04-03
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多