Объединение двух массивов numpy в 4-ом измерении

У меня есть два массива numpy с тремя размерами (3 x 4 x 5), и я хочу объединить их, чтобы результат имел четыре измерения (3 x 4 x 5 x 2). В Matlab это можно сделать с cat(4, a, b) , но не в Numpy.

Например:

 a = ones((3,4,5)) b = ones((3,4,5)) c = concatenate((a,b), axis=3) # error! 

Чтобы уточнить, я хочу, чтобы c[:,:,:,0] и c[:,:,:,1] соответствовали исходным двум массивам.

5 Solutions collect form web for “Объединение двух массивов numpy в 4-ом измерении”

Ну вот:

 import numpy as np a = np.ones((3,4,5)) b = np.ones((3,4,5)) c = np.concatenate((a[...,np.newaxis],b[...,np.newaxis]),axis=3) 

Как насчет следующего:

 c = concatenate((a[:,:,:,None],b[:,:,:,None]), axis=3) 

Это дает массив (3 x 4 x 5 x 2), который, как мне кажется, выложен так, как вам нужно.

Здесь None является синонимом np.newaxis : Numpy: следует ли использовать newaxis или None?

Как было предложено @Joe Kington, код можно немного очистить, используя многоточие:

 c = concatenate((a[...,None],b[...,None]), axis=3) 

Принятый ответ выше велик. Но я добавлю следующее, потому что я – математический дорк, и приятно использовать тот факт, что a.shape – это aTshape[::-1] … т.е. перенос транспонирования меняет порядок индексов numpy массив. Поэтому, если у вас есть ваши строительные блоки в массиве, называемом блоками, то решение выше:

 new = np.concatenate([block[..., np.newaxis] for block in blocks], axis=len(blocks[0].shape)) 

но вы также можете сделать

 new2 = np.array([block.T for block in blocks]).T 

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

 %%timeit new = np.concatenate([block[..., np.newaxis] for block in blocks], axis=len(blocks[0].shape)) 1000 loops, best of 3: 321 µs per loop 

в то время как

 %%timeit new2 = np.array([block.T for block in blocks]).T 1000 loops, best of 3: 407 µs per loop 

Это работает для меня:

  c = numpy.array([a,b]) 

Хотя было бы неплохо, если бы это тоже сработало.

Это не обязательно самый элегантный, но я использовал вариации

 c = rollaxis(array([a,b]), 0, 4) 

в прошлом.

  • Функции записи, которые принимают как массивы 1-D, так и 2-D numpy?
  • Создание регулярной сетки Delaunay в scipy
  • удалить нулевые строки 2-D numpy array
  • Как включить динамическое время?
  • Как я могу создать нужный файл .npy на диске?
  • Легкий способ проверить, находится ли каждый элемент в массиве numpy между двумя значениями?
  • ValueError: numpy.dtype имеет неправильный размер, попробуйте перекомпилировать
  • Уменьшить доступ к отдельным элементам, чем для списков
  • Python - лучший язык программирования в мире.