Есть ли эффективный способ объединить 4 маленьких массива в один большой массив, используя чередующийся шаблон «mosai c»? - PullRequest
2 голосов
/ 04 марта 2020

У меня есть 4 квадратных массива одинаковой формы

array1 = 1*np.ones((10,10))
array2 = 2*np.ones((10,10))
array3 = 3*np.ones((10,10))
array4 = 4*np.ones((10,10))

Я хочу объединить их в один большой массив в чередующемся шаблоне mosai c как таковом:

result = np.asarray([[1,2,1,2,...,1,2],\
                     [3,4,3,4,...,3,4],\
                     [1,2,1,2,...,1,2],\
                     ...
                     [3,4,3,4,...,3,4]])

Где result в два раза больше в обоих измерениях, чем исходные отдельные изображения.

Есть ли эффективный способ сделать это?

Чтобы проиллюстрировать мой вопрос, я использовал массивы, содержащие постоянные значения, но в действительности , эти 4 массива будут разными изображениями.

1 Ответ

2 голосов
/ 04 марта 2020

Два распространенных подхода для чередования данных в numpy:

A) Назначить каждый источник срезом пустого массива результатов, в соответствии с которым данные должны go:

result = np.zeros((20, 20)) # allocate space
result[::2, ::2] = array1 # put those values in the appropriate spots
result[::2, 1::2] = array2
result[1::2, ::2] = array3
result[1::2, 1::2] = array4

B) использовать стекирование, чтобы связать данные в один массив, а затем изменить форму, чтобы сгладить данные таким образом, чтобы они были чересстрочными. Обычно это требует проб и ошибок, но, немного поиграв с REPL, я придумал:

result = np.hstack((np.dstack((array1, array2)), np.dstack((array3, array4)))).reshape(20, 20)
...