如何从numpy中的p * q较大矩阵中获得m * n子矩阵

时间:2018-05-18 09:42:09

标签: python numpy matrix

在尝试解决与数独相关的问题时遇到了这个问题。

我需要从较大的9 * 9矩阵返回所有3 * 3矩阵。

有没有直接的方法在numpy中这样做?

我当前的方法涉及在水平方向上执行两次分割,然后在从先前分割获得的列表中的每个元素上执行垂直分割

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


for i in np.split(grid,3):
    for t in (np.hsplit(i,3)):
        print(t)

2 个答案:

答案 0 :(得分:0)

您可以通过调整数组的形状和步幅来实现平铺:

import numpy as np

x = np.arange(81).reshape(9, 9)

r = x.strides[0]
c = x.strides[1]

y = np.lib.stride_tricks.as_strided(x, shape=(3, 3, 3, 3), strides=(r*3, c*3, r, c))
print(y[1, 1])
# [[30 31 32]
#  [39 40 41]
#  [48 49 50]]
  1. 使用shape=(3,3, 3,3),我们指定所需的输出形状:3x3子阵列,每个大小为3x3。

  2. 使用strides=,我们指定沿维度从一个元素到下一个元素时内存地址的变化。 r*3, c*3:子网格以三行和三列为间隔。 r, c:子网格中元素之间的间距与原始数组中的间距相同。

  3. 如果您想要一个简单的子阵列列表而不是2D排列,您可以y.reshape(9, 3, 3)

答案 1 :(得分:0)

不确定这是否是最短路径,但您可以通过多次重塑和转置获得结果:

import numpy as np

a = np.arange(81).reshape((9, 9))
print(a)
# [[ 0  1  2  3  4  5  6  7  8]
#  [ 9 10 11 12 13 14 15 16 17]
#  [18 19 20 21 22 23 24 25 26]
#  [27 28 29 30 31 32 33 34 35]
#  [36 37 38 39 40 41 42 43 44]
#  [45 46 47 48 49 50 51 52 53]
#  [54 55 56 57 58 59 60 61 62]
#  [63 64 65 66 67 68 69 70 71]
#  [72 73 74 75 76 77 78 79 80]]
b = np.transpose(np.transpose(np.transpose(a.reshape((3, 3, 9)), (1, 0, 2)).reshape((3, -1))).reshape((9, 3, 3)), (0, 2, 1))
print(b[0])
# [[ 0  1  2]
#  [ 9 10 11]
#  [18 19 20]]
print(b[1])
# [[ 3  4  5]
#  [12 13 14]
#  [21 22 23]]
# ...