Объединение двух массивов 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) 

в прошлом.

  • как добавить матрицу numpy в пустой массив numpy
  • перетасовка / перестановка DataFrame в пандах
  • Эффективная 2D-матрица из массива 1D
  • Уменьшить Dimensons при преобразовании списка в массив
  • Pandas, groupby и нахождение максимума в группах, возвращающее значение и количество
  • Почему numba быстрее, чем numpy здесь?
  • Как установить NumPy для Python 3.6
  • pythonic способ удаления элементов из массива numpy
  • Определенный способ разбора алфавитно-цифровых CSV в Python с scipy / numpy
  • Каково использование numpy.random.seed () Разве это имеет значение?
  • 3D-графика с питоном
  • Python - лучший язык программирования в мире.