当前位置: 首页 > 知识库问答 >
问题:

使用具有numpy阵列的特定大小的较小矩阵在n x n矩阵中循环

赫连俊雄
2023-03-14

我目前有以下问题,给定一个数组,为了简单起见,假设一个4 x 4数组(我实际上正在使用512 x 512)

X = np.array([[3, 5, 2, 4],
              [7, 6, 8, 8],
              [1, 6, 7, 7],
              [2, 1, 3, 4]])

我想在数组周围循环/滑动,这样我就可以在表单中保存新数组

< code>np.array([3,5],[7,6]),np.array([2,4],[8,8]),np.array([1,6],[2,1]),np.array ([7,7],[1,4])等等(理想情况下,我可以选择我的“滑动”窗口的步长和大小)。我还想根据一些条件选择这些数组,见下文。

目前,我设法通过切片(参见代码)我的矩阵来做几乎所有事情。这给出了我想要的步骤的正确切片,然后通过使用 itertools 模块,我可以遍历我的所有列表列表,计算小于某个值的元素并保存它们。我不能做的是将所有这些新列表之间的索引链接到主矩阵。出于这个原因,我正在考虑将所有内容移动到 numpy 数组,这应该(在我的理解中)在计算方面更有效率,我想应该解决我的索引问题。现在唯一的问题是我不知道为任意 n x n 矩阵解决这个问题。

X = np.array([[3, 5, 2, 4],
          [7, 6, 8, 8],
          [1, 6, 7, 7],
          [2, 1, 3, 4]])

width = len(m[0])
height = len(m)
height = 2  # size of the matrix sliding
width = 2
for i in range(0, height - slice_y + 1,2):
    for j in range(0, width - slice_x + 1,2):

        Appended.append(
                [
                    [m[a][b] for b in range(j, j + slice_x)]
                    for a in range(i, i + slice_y)
                ]

            )

理想情况下,我想要的是一个一般的矩阵N x N,但目前也只像示例中那样,以数组形式获得输出,如:

np.array([3,5],[7,6]) .  np.array ([2,4], [8,8])  ,  np.array  ([1,6],[2,1]),   np.array ([7,7],[1,4])

假设有一次发现数组 np.array([2,4], [8,8]) 有两个大于 7 的元素,总和大于 20,以保存这个数组相对于我的初始矩阵的坐标。因此,保存索引耦合 X[0][2]、X[0][3]、X[1][2]、X[1][3] 或至少是第一个 X[0][2],因此通过了解我的“窗口”的步骤,我可以通过索引我的主矩阵来访问我的子数组。

共有1个答案

鄢开诚
2023-03-14

显然,您可以直接切片Numpy数组

X = np.array([[3, 5, 2, 4],
      [7, 6, 8, 8],
      [1, 6, 7, 7],
      [2, 1, 3, 4]])[0:2,0:2]

在你的例子中,我会生成一个你将要使用的子矩阵的边的索引列表。然后使用它来生成子矩阵列表,然后使用它来基于子矩阵生成真或假值列表。然后,您可以使用该真/假值列表来删除您的初始指数列表。您也可以在根本不存储子矩阵的情况下做到这一点。

indicies= [((i,i+s_width),(j,j+s_height)) for i in range(0,width-s_width) for j in range(0,height-s_height)]
 类似资料:
  • 给定一个2维正整数数组,求和最大的HxW子矩形。矩形的总和是该矩形中所有元素的总和。 输入:具有正元素的二维数组NxN子矩形的HxW大小 输出:HxW大小的子矩阵,其元素的总和最大。 我已经使用蛮力方法解决了这个问题,但是,我现在正在寻找一个具有更好复杂性的更好的解决方案(我的蛮力法的复杂性是O(n6))。

  • 问题内容: 我是Numpy的新手,想替换矩阵的一部分。例如,我有两个由numpy生成的矩阵A,B 最终,我想使A为以下矩阵。 和/或以下 我尝试跟随,但没有用。我现在不知道了:( 甚至我尝试过 检查四个单元是否更改。你有什么主意吗? 问题答案: 这是您可以执行的操作:

  • 我有一个大的NxN位数组,有K个1(其他都是0)。所有非零点的坐标都是已知的——换句话说,这个n×n数组可以表示为K对数组,每个数组包含一个非零点的x和y坐标。 给定一个HxW大小的子矩阵,我需要将其放在我的原始NxN数组上,使其覆盖大多数非零点。 输入:子矩阵的高度H和宽度W 输出:HxW子数组的x和y协弦,其内部有最多的协弦 之前也回答过类似的问题:2D矩阵中尺寸为HxW的最大子阵列,但在我的

  • 问题内容: 我正在尝试编写一种算法,用于在给定的子矩阵中查找子矩阵。为了解决这个问题,我编写了以下代码: 这段代码可以正常工作,但是我不确定这是问题的确切解决方案还是可以解决。请提供您的专家意见。提前致谢。 问题答案: 该算法对4×4矩阵和2×2子矩阵进行了硬编码。否则,它看起来像蛮力算法。 我会这样表示: 如果您想要更有效的方法,建议您将它们压扁,如下所示: 并在此序列中搜索以下模式: 使用标准

  • 问题内容: 我有以下内容: 如何在XYZ_2上执行与在XYZ_2上相同的操作?我会以某种方式首先重塑数组吗? 问题答案: 您似乎正在尝试的最后一个轴 与最后一个 。因此,您可以像这样使用- 相关帖子了解。 为了完整起见,在交换的最后两个轴后,我们当然也可以使用,例如- 这将不如一个高效。 运行时测试- 一般而言,涉及张量时,效率要高得多。由于的轴只有一个,因此我们可以通过重整,使用,获取结果并将其

  • 假设我在java中有一个主类,它接收一个矩阵[][],比如: ` '然后用户输入输入: 我知道这是一个5x5的矩阵,但只是因为我看到了用户输入的内容,我如何获得矩阵的大小- 我什么也没试过,我是Java初学者,所以请耐心等待。