在尝试解决与数独相关的问题时遇到了这个问题。
我需要从较大的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)
答案 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]]
使用shape=(3,3, 3,3)
,我们指定所需的输出形状:3x3子阵列,每个大小为3x3。
使用strides=
,我们指定沿维度从一个元素到下一个元素时内存地址的变化。 r*3, c*3
:子网格以三行和三列为间隔。 r, c
:子网格中元素之间的间距与原始数组中的间距相同。
如果您想要一个简单的子阵列列表而不是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]]
# ...