Комбинация всех рядов в двух четырехмерных массивах - PullRequest
0 голосов
/ 16 октября 2018

У меня есть два массива с именем my_arr1, my_arr2, оба из которых имеют размер 100x30x30x3.Я хотел бы вывести комбинацию каждой строки первого массива с каждой строкой из второго массива и привести к двум новым массивам размером 10000x30x30x3.Мне удалось сделать это с более простым примером с двумя массивами размером 4x2 , следуя этому примеру :

a1_ = np.array([[1, 1],
           [2, 2],
           [3, 0],
           [4, 2],
           [5, 3]])
a2_ = np.array([[10, 1],
           [11, 2],
           [12, 0],
           [13, 2],
           [14, 3]])


def combine_matrices(a1, a2):

   m1, n1 = a1.shape
   m2, n2 = a2.shape
   out = np.zeros((m1, m2, n1+n2), dtype=int)
   out[:, :, :n1] = a1[:, None, :]
   out[:, :, n1:] = a2
   out.shape = (m1*m2, -1)

 return out

Результатом является массив 25x4, который можно разбить надва массива 25x2.Как я могу изменить мою функцию, если a1 = np.zeros((100, 30, 30, 3)) и a2 = np.zeros((100. 30, 30, 3)) с окончательной областью видимости, чтобы вернуть два массива размером (10000, 30, 30 ,3), а не только один.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Не на 100% уверен, что это именно то, что вам нужно, но он получает правильные формы.

Сначала создайте диагностические входы

>>> a1 = np.empty((2, 2, 2, 3, 4), 'U1')
>>> for i, x in enumerate(np.ogrid[:2, :2, :2, :3]):
...      a1[..., i] = x
... 
>>> a2 = a1 = a1.view('U4').reshape(a1.shape[:-1])
>>> a1
array([[[['0000', '0001', '0002'],
         ['0010', '0011', '0012']],

        [['0100', '0101', '0102'],
         ['0110', '0111', '0112']]],


       [[['1000', '1001', '1002'],
         ['1010', '1011', '1012']],

        [['1100', '1101', '1102'],
         ['1110', '1111', '1112']]]], dtype='<U4')

Далее, выделите вывод

>>> A1, A2 = (np.empty((a.shape[0], *a.shape), a.dtype) for a in (a1, a2))

Заполните, используя трансляцию

>>> A1[...] = a1[:, None]
>>> A2[...] = a2[None]

Объедините первые две оси

>>> A1, A2 = (A.reshape(-1, *A.shape[2:]) for A in (A1, A2))

Готово

>>> A1
array([[[['0000', '0001', '0002'],
         ['0010', '0011', '0012']],

        [['0100', '0101', '0102'],
         ['0110', '0111', '0112']]],


       [[['0000', '0001', '0002'],
         ['0010', '0011', '0012']],

        [['0100', '0101', '0102'],
         ['0110', '0111', '0112']]],


       [[['1000', '1001', '1002'],
         ['1010', '1011', '1012']],

        [['1100', '1101', '1102'],
         ['1110', '1111', '1112']]],


       [[['1000', '1001', '1002'],
         ['1010', '1011', '1012']],

        [['1100', '1101', '1102'],
         ['1110', '1111', '1112']]]], dtype='<U4')
>>> A2
array([[[['0000', '0001', '0002'],
         ['0010', '0011', '0012']],

        [['0100', '0101', '0102'],
         ['0110', '0111', '0112']]],


       [[['1000', '1001', '1002'],
         ['1010', '1011', '1012']],

        [['1100', '1101', '1102'],
         ['1110', '1111', '1112']]],


       [[['0000', '0001', '0002'],
         ['0010', '0011', '0012']],

        [['0100', '0101', '0102'],
         ['0110', '0111', '0112']]],


       [[['1000', '1001', '1002'],
         ['1010', '1011', '1012']],

        [['1100', '1101', '1102'],
         ['1110', '1111', '1112']]]], dtype='<U4')
0 голосов
/ 16 октября 2018

Вы можете сделать это с помощью numpy.outer

Вы не можете просто использовать эту функцию, и может быть что-то лучше, но я думаю, что вам придется перебирать своидругие значения матрицы.

# Use transpose to make the empty array shape (10x30x30x1000)
out_arr = numpy.zeros(shape=(1000, 30, 30, 10)).transpose()

for i in range(out_arr.shape[0]):
   for j in range(out_arr.dtype[1]):
      for k in range(out_arr.dtype[2]):
          # Use transpose again to get the data you want 
          # (transposing first before grabbing the index) 
          out_arr[i][j][k] = numpy.outer(arr1.transpose()[i][j][k], arr2.transpose()[i][j][k])

# 1000x30x30x10 array (rather than 10x30x30x1000)
out_arr = out_arr.transpose()

Я использую транспонирование как трюк, потому что вы сказали, что данные (1000, 30, 30, 10).

Одна вещь, которая сбивает меня с толку в работес этим делает ошибку, пытаясь сделать:

arr[:][i][j][k]

, потому что это не будет захватывать память, которую вы хотели бы в этом случае.Он захватывает те же данные, что и:

arr[i][j][k]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...