从更大的矩阵创建 8x8 矩阵
Creating 8x8 matrices out of a bigger matrix
我目前有一个170x296的矩阵,需要将它分成8x8的矩阵。关于如何做到这一点有什么想法吗?
[1 , 2 , 3 , 4 , ... , 170] --> 296x170 matrix
[171 , ... ]
[342 , ... ]
[... ]
[49900 ... ]
我想把它转换成:
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
[171 , 172 , 173 , 174 , 175 , 176 , 177 , 178]
[... ]
[9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ]
[179, 180 , 181 , 182 , 183 , 184 , 185 , 186]
[... ]
等等。
(在本例中,它是一个 170x296 矩阵,因此并非所有值都适合 8x8 矩阵。最后几个不适合的值可以存储在列表中。)
谢谢!
这是使用一些测试单位矩阵的一种可能的解决方案。使用 flatten
,您将大的单个矩阵转换为一维数组,然后简单地遍历 64 个子组中的元素并将它们转换回 8x8 子矩阵,如果您想存储它们,则将它们保存到某个列表中.你只需要一个 for 循环。其余不构成矩阵的元素可以使用 %
模数运算符和索引切片 [-length%64:]
存储在列表中
a = np.eye(170, 296)
a_flat = a.flatten()
length = len(a_flat)
new_matrices = []
for i in range(0, length, 64):
try:
new_matrices.append(a_flat[i:i+64].reshape((8,8)))
except:
break
remaining = a_flat[-(length%64):]
最简单的解决方案很可能是 Scikit-Image 的 view_as_blocks
:
import numpy as np
import skimage.util
img = np.arange(296 * 170).reshape(296, 170)
# Make sure the image dimensions are a multiple of 8
img = img[:, :-2]
img_blocks = skimage.util.view_as_blocks(img, block_shape=(8, 8))
img_blocks.shape
# (37, 21, 8, 8)
可以看到,img
被切割成8x8
块,纵向37块,横向21块。
对于玩具示例,很容易看出发生了什么:
import numpy as np
import skimage.util
img = np.arange(4 * 6).reshape(4, 6)
img
# array([[ 0, 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16, 17],
# [18, 19, 20, 21, 22, 23]])
img_blocks = skimage.util.view_as_blocks(img, block_shape=(2, 2))
img_blocks
# array([[[[ 0, 1],
# [ 6, 7]],
#
# [[ 2, 3],
# [ 8, 9]],
#
# [[ 4, 5],
# [10, 11]]],
#
#
# [[[12, 13],
# [18, 19]],
#
# [[14, 15],
# [20, 21]],
#
# [[16, 17],
# [22, 23]]]])
我目前有一个170x296的矩阵,需要将它分成8x8的矩阵。关于如何做到这一点有什么想法吗?
[1 , 2 , 3 , 4 , ... , 170] --> 296x170 matrix
[171 , ... ]
[342 , ... ]
[... ]
[49900 ... ]
我想把它转换成:
[1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
[171 , 172 , 173 , 174 , 175 , 176 , 177 , 178]
[... ]
[9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ]
[179, 180 , 181 , 182 , 183 , 184 , 185 , 186]
[... ]
等等。
(在本例中,它是一个 170x296 矩阵,因此并非所有值都适合 8x8 矩阵。最后几个不适合的值可以存储在列表中。)
谢谢!
这是使用一些测试单位矩阵的一种可能的解决方案。使用 flatten
,您将大的单个矩阵转换为一维数组,然后简单地遍历 64 个子组中的元素并将它们转换回 8x8 子矩阵,如果您想存储它们,则将它们保存到某个列表中.你只需要一个 for 循环。其余不构成矩阵的元素可以使用 %
模数运算符和索引切片 [-length%64:]
a = np.eye(170, 296)
a_flat = a.flatten()
length = len(a_flat)
new_matrices = []
for i in range(0, length, 64):
try:
new_matrices.append(a_flat[i:i+64].reshape((8,8)))
except:
break
remaining = a_flat[-(length%64):]
最简单的解决方案很可能是 Scikit-Image 的 view_as_blocks
:
import numpy as np
import skimage.util
img = np.arange(296 * 170).reshape(296, 170)
# Make sure the image dimensions are a multiple of 8
img = img[:, :-2]
img_blocks = skimage.util.view_as_blocks(img, block_shape=(8, 8))
img_blocks.shape
# (37, 21, 8, 8)
可以看到,img
被切割成8x8
块,纵向37块,横向21块。
对于玩具示例,很容易看出发生了什么:
import numpy as np
import skimage.util
img = np.arange(4 * 6).reshape(4, 6)
img
# array([[ 0, 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16, 17],
# [18, 19, 20, 21, 22, 23]])
img_blocks = skimage.util.view_as_blocks(img, block_shape=(2, 2))
img_blocks
# array([[[[ 0, 1],
# [ 6, 7]],
#
# [[ 2, 3],
# [ 8, 9]],
#
# [[ 4, 5],
# [10, 11]]],
#
#
# [[[12, 13],
# [18, 19]],
#
# [[14, 15],
# [20, 21]],
#
# [[16, 17],
# [22, 23]]]])