Создание матриц 8х8 из большей матрицы - PullRequest
0 голосов
/ 01 декабря 2018

В настоящее время у меня матрица 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. Последние несколько значений, которые не уместились, можно сохранить в списке.)

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Самым простым решением, скорее всего, будет 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]]]])
0 голосов
/ 01 декабря 2018

Вот одно из возможных решений с использованием некоторой тестовой идентификационной матрицы.Используя flatten, вы преобразуете свою большую одиночную матрицу в 1-й массив, а затем просто зацикливаете элементы в подгруппах по 64, преобразуете их обратно в подматрицы 8x8 и сохраняете их в некоторый список, если хотите сохранить их.Вам просто нужен один для цикла.Оставшиеся элементы, которые не составляют матрицу, можно сохранить в списке с помощью оператора модуля % и нарезки индекса [-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):]   
...