Стек 2D-массива в 4D - PullRequest
0 голосов
/ 09 мая 2020

Дан список из 6 2D-массивов с одинаковым размером (200, 200). Каждые три последовательных массива можно объединить в 3D-массив.

Желаемый результат:

array = (200, 200, 3, 2)

Я знаком с np.dstack:

n = 6
array = []
for i in range(n):
    x = np.random.randn(n1, n2)
    array.append(x)
array = np.dstack(array)

Скорость должна считается, так как я работаю с большими наборами данных.


Изменить: я создал изображения для тестирования: https://wetransfer.com/downloads/afb0a2fbfbd8b6047a68dad41b56a0d520200509184625/761355

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Адаптированный ответ Пэдди:

import numpy as np
from skimage import io
import glob
from natsort import natsorted

DIR = (Set folder path with the test images)

list_path = glob.glob(DIR + "/*.png")
list_path_sorted = natsorted(list_path)
array = []
for i in range(len(list_path_sorted)):
    image = np.array( io.imread(list_path_sorted[i]) )
    array.append(image)
a = np.dstack(array).reshape(200, 200, 3, 2)

a.shape
>>> (200, 200, 3, 2)

Проблема: Заказ в третьем измерении не совпадает. Чтобы проверить это:

plt.imshow(a[:,:,0,0]) -> should show picture with A1
plt.imshow(a[:,:,2,0]) -> should show picture with A3
plt.imshow(a[:,:,0,1]) -> should show picture with B1
plt.imshow(a[:,:,2,1]) -> should show picture with B3

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

dstack как вы предложили, затем reshape результирующий массив:

import numpy as np

# six arrays of (200, 200)
n = 6
array = []
for i in range(n):
    x = np.random.randn(n1, n2)
    array.append(x)

# EDIT to use 'F' ordering
a = np.dstack(array).reshape(200, 200, 3, 2, order='F')

a.shape
>>> (200, 200, 3, 2)
1 голос
/ 09 мая 2020

Я не могу играть с вашими изображениями, поэтому я сгенерирую список отличительных (2,2) массивов:

In [412]: alist = [np.arange(i,i+4).reshape(2,2) for i in range(6)]                                    
In [413]: alist                                                                                        
Out[413]: 
[array([[0, 1],
        [2, 3]]), array([[1, 2],
        [3, 4]]), array([[2, 3],
        [4, 5]]), array([[3, 4],
        [5, 6]]), array([[4, 5],
        [6, 7]]), array([[5, 6],
        [7, 8]])]

С dstack мы получим (2,2,6 ) array

In [414]: arr = np.dstack(alist)                                                                       
In [415]: arr                                                                                          
Out[415]: 
array([[[0, 1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5, 6]],

       [[2, 3, 4, 5, 6, 7],
        [3, 4, 5, 6, 7, 8]]])

Изменение формы (3,2) дает:

In [417]: arr.reshape(2,2,3,2)                                                                         
Out[417]: 
array([[[[0, 1],
         [2, 3],
         [4, 5]],

        [[1, 2],
         [3, 4],
         [5, 6]]],


       [[[2, 3],
         [4, 5],
         [6, 7]],

        [[3, 4],
         [5, 6],
         [7, 8]]]])

Похоже, вас не устраивает этот макет (ваши правки немного неясны). Мы можем транспонировать значения

In [419]: arr.reshape(2,2,2,3).transpose(0,1,3,2)                                                      
Out[419]: 
array([[[[0, 3],
         [1, 4],
         [2, 5]],

        [[1, 4],
         [2, 5],
         [3, 6]]],


       [[[2, 5],
         [3, 6],
         [4, 7]],

        [[3, 6],
         [4, 7],
         [5, 8]]]])

С этим последним расположением

In [431]: _419[:,:,2,0]                                                                                
Out[431]: 
array([[2, 3],
       [4, 5]])
In [432]: _413[2]       # alist                                                                               
Out[432]: 
array([[2, 3],
       [4, 5]])

In [435]: _419[:,:,0,1]                                                                                
Out[435]: 
array([[3, 4],
       [5, 6]])
In [436]: _413[3]                                                                                      
Out[436]: 
array([[3, 4],
       [5, 6]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...