как получить индивидуальные номера коробки - PullRequest
0 голосов
/ 30 апреля 2018

Я изо всех сил пытаюсь получить каждое из четырех чисел массива python, содержащихся в 2x2, в свои отдельные массивы, очень похожее на сетку судоку. Заказ не имеет значения. Я бы попытался написать код или еще что-нибудь, но мой разум опустел.

пример сетки

[
    [ 1,  2,  3,  4],
    [ 5,  6,  7,  8],
    [ 9, 10, 11, 12],
    [13, 14, 15, 16]
]

Я хочу иметь возможность получить его в форме

[
    [ 1,  2,  5,  6],
    [ 3,  4,  7,  8],
    [ 9, 10, 13, 14],
    [11, 12, 15, 16]
]

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Я наконец нашел решение своего вопроса с небольшой модификацией этого ответа

cells = [[] * 4 for x in range(4)]
for row_index, row in enumerate(grid):
    for col_index, col in enumerate(row):
        i = col_index//2 + 2*(row_index//2)
        cells[i].append(col)
0 голосов
/ 30 апреля 2018

Вот чистое решение Python. Если вам нужно что-то более читаемое, подумайте об использовании NumPy (см. Ниже).

>>> from itertools import count, chain
>>> 
# create 2x2 blocks of 2x2
>>> c = count(1)
>>> L4D = [[[[next(c) for i in range(2)] for j in range(2)] for k in range(2)] for l in range(2)]
>>> L4D
[[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]]

# swap middle dimensions
>>> L4D = [zip(*i) for i in L4D]
# next line is not necessary, only here so we can see what's going on
>>> L4D = [list(i) for i in L4D]
>>> L4D
[[([1, 2], [5, 6]), ([3, 4], [7, 8])], [([9, 10], [13, 14]), ([11, 12], [15, 16])]]

# join first two and last two dimensions
>>> result = [list(chain.from_iterable(j)) for j in chain.from_iterable(L4D)]
>>> result
[[1, 2, 5, 6], [3, 4, 7, 8], [9, 10, 13, 14], [11, 12, 15, 16]]

Если вы используете NumPy, это можно упростить. Вот три разных варианта. Первый - прямой перевод чистого решения Python:

>>> import numpy as np
>>> 
>>> np.arange(1, 17).reshape(2, 2, 2, 2).swapaxes(1, 2).reshape(4, 4)
array([[ 1,  2,  5,  6],
       [ 3,  4,  7,  8],
       [ 9, 10, 13, 14],
       [11, 12, 15, 16]])
>>> np.block(list(map(list, np.arange(1, 17).reshape(2, 2, 2, 2))))
array([[ 1,  2,  5,  6],
       [ 3,  4,  7,  8],
       [ 9, 10, 13, 14],
       [11, 12, 15, 16]])
>>> a = np.arange(4).reshape(2, 2)
>>> b = np.ones((2, 2), dtype = int)
>>> 4 * np.kron(a, b) + np.kron(b, a) + 1
array([[ 1,  2,  5,  6],
       [ 3,  4,  7,  8],
       [ 9, 10, 13, 14],
       [11, 12, 15, 16]])
...