Конкатенация двух массивов в 4-м измерении - PullRequest
26 голосов
/ 17 января 2012

У меня есть два массива 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] соответствовали исходным двум массивам.

Ответы [ 6 ]

28 голосов
/ 17 января 2012

Вот, пожалуйста:

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)
14 голосов
/ 28 октября 2017

А как же

c = np.stack((a,b), axis=3)
12 голосов
/ 17 января 2012

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

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

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

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

edit Как подсказал @Joe Kington, код можно немного очистить с помощью многоточия:

c = concatenate((a[...,None],b[...,None]), axis=3)
8 голосов
/ 26 января 2015

Принято, ответ выше велик.Но я добавлю следующее, потому что я математик-придурок, и хорошо использовать тот факт, что a.shape равно a.T.shape[::-1] ... т. Е. Взятие транспонирования меняет порядок индексов массива.Итак, если у вас есть строительные блоки в массиве, называемом блоками, то решение выше:

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
1 голос
/ 17 января 2012

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

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

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

0 голосов
/ 17 января 2012

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

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

в прошлом.

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