通过numpy数组循环遍历具有特定大小的较小矩阵的n x n矩阵

时间:2019-04-21 00:45:39

标签: python arrays loops numpy sliding-window

我目前遇到以下问题,给定一个数组,为简单起见,我们说一个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]])

我想以一种可以在表格中保存新数组的方式循环/滑动数组

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 个答案:

答案 0 :(得分:0)

您显然可以直接切片numpy数组

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

在您的情况下,我将生成要使用的子矩阵的边缘索引列表。然后使用它来生成子矩阵列表,然后使用它来基于子矩阵生成真值或假值列表。然后,您可以使用该true / false值列表来修剪初始索引列表。您也可以完全不存储子矩阵来执行此操作。

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)]