当前位置: 首页 > 面试题库 >

在numpy中的二维数组上的矢量化移动窗口

仲孙铭
2023-03-14
问题内容

我在2D数组上恒定大小的移动窗口上执行操作。我可以实现高效的类似于矢量化的操作来执行此操作而无需在Python中循环吗?我目前的结构看起来像这样

 for i in range(1,xmax-1):
     for j in range(1,ymax-1):
        out[i][j] = f(in[i][j],in[i+1][j],in[i-1][j],in[i][j+1],in[i][j-1],...)

这些评论可以 留在这个问题暗指矢量化这种操作这种可能性,但没有进一步的细节矢量索引/切片在numpy的/SciPy的?


问题答案:

如果可以表达功能

f(in[i][j],in[i+1][j],in[i-1][j],in[i][j+1],in[i][j-1],…)

作为一个线性算,你可以使用SciPy的的signal.convolve2d函数来做到这一点。例如,假设您有一个50x50的数组A,并且要计算第二个数组B,其中每个元素b[ij]都是a[i,j], a[(i-1),j], a[i,(j-1)], a[(i-1),(j-1)]数组A的平均值。您可以这样做:

A = # your first array
B = numpy.ones((2,2))/4
C = scipy.signal.convolve2d(A,B, 'valid')

当执行卷积时,数组B在A上“滑动”,将相应的元素相乘并求和。由于边界效应,在使用结果数组C时必须小心。这里,C的形状为49x49,这是因为中的'valid'参数convolve2d要丢弃第一行和第一列,因为它们包含边界效应。如果您希望有一个50x50的数组而不丢弃,则可以将该参数交换为'same'

编辑 :也许如果您能告诉我更多有关您需要的功能的信息,我可以帮助您更具体地将其转换为用于进行2D卷积的数组。

希望有帮助!



 类似资料:
  • 问题内容: 有没有一种方法可以有效地为Numpy中的1D数组实现滚动窗口? 例如,我有这个纯Python代码段来计算一维列表的滚动标准偏差,其中一维值列表和标准偏差的窗口长度: 有没有办法在Numpy内完全做到这一点,即没有任何Python循环?标准偏差对于而言是微不足道的,但是滚动窗口部分完全使我难过。 我发现这个关于numpy的滚动窗口博客文章,但似乎并没有为一维数组。 问题答案: 只需使用博

  • 问题内容: 我有一个二维的numpy数组。我想对每个条目取n个最近条目的平均值,就像对一维数组取滑动平均值一样。什么是最干净的方法? 问题答案: 这与将 滤镜 应用于 图像的 概念类似。 幸运的是,有很多功能可以做到这一点。您所追求的是。 可以这样使用: 如果您需要5x5滤镜,请使用。该选项控制如何处理边缘。您没有指定要如何处理边缘。在此示例中,“常量”模式表示将数组边界之外的每个项目都视为常量值

  • 问题内容: 我想通过指定2D数组中的列数将一维数组转换为二维数组。可能会像这样工作: numpy是否具有与我的虚构函数“ vec2matrix”相似的功能?(我知道您可以像2D数组一样索引1D数组,但这不是我拥有的代码中的选项- 我需要进行此转换。) 问题答案: 您要阵列。 其中,根据输入数组的大小推断新维的大小。

  • 问题内容: 我想获取与行匹配的二维Numpy数组的索引。例如,我的数组是这样的: 我想获取与行[0,1]相匹配的索引,该行是索引3和15。当我执行类似的操作时,… 我想要索引数组([3,15])。 问题答案: 您需要使用函数来获取索引: 或者,如文档所述: 如果仅给出条件,则返回 您可以直接调用返回的数组: 分解: 并在该数组上调用方法(使用)可为您提供两个均为True的位置: 并获取哪些索引是:

  • 问题内容: 几年前从这个问题开始,在numpy中是否有规范的“移位”功能?我从文档中看不到任何东西。 这是我正在寻找的简单版本: 使用它就像: 这个问题来自于我昨天尝试[编写快速滚动产品的](http://codingdict.com/questions/163825尝试。我需要一种“转移”累积乘积的方法,我所能想到的就是在中复制逻辑。 因此比快得多。此版本的功能执行得更好: 更快的版本只是简单地

  • 问题内容: 我想创建一个数组,其中包含通过给定numpy数组移动的窗口的所有es。很抱歉,这听起来令人困惑。我举一个例子。输入: 我的窗口宽度为5的输出应为: 每个数字应为输入数组宽度5的子数组的最大值: 我没有在numpy中找到一个开箱即用的函数来做到这一点(但是如果有一个,我不会感到惊讶;我并不是一直以numpy开发人员的想法来思考)。我考虑过为输入创建偏移的2D版本: 然后,我可以对此进行申