functions python numpy

python - functions - Concatenar dos matrices numpy en la 4ta dimensión



numpy python 3.6 windows (6)

¿Qué hay de lo siguiente:

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

Esto proporciona una matriz (3 x 4 x 5 x 2), que creo que está dispuesta de la manera que usted necesita

Aquí, None es sinónimo de np.newaxis : Numpy: ¿Debo usar newaxis o None?

edit Según lo sugerido por @Joe Kington, el código se puede limpiar un poco usando puntos suspensivos:

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

Tengo dos matrices numpy con tres dimensiones (3 x 4 x 5) y quiero concatenarlas para que el resultado tenga cuatro dimensiones (3 x 4 x 5 x 2). En Matlab, esto se puede hacer con cat(4, a, b) , pero no en Numpy.

Por ejemplo:

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

Para aclarar, deseo que c[:,:,:,0] c[:,:,:,1] correspondan con las dos matrices originales.


Aqui tienes:

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)


Esto funciona para mí:

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

Aunque sería bueno si funcionara a tu manera, también.


La respuesta aceptada arriba es genial. Pero a.shape siguiente porque soy un tonto matemático y es un buen uso del hecho de que a.shape es aTshape[::-1] ... es decir, tomar una transposición invierte el orden de los índices de un numpy formación. Entonces, si tiene sus bloques de construcción en una matriz llamada bloques, la solución anterior es:

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

pero también podrías hacer

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

que creo que lee más limpiamente Vale la pena señalar que la respuesta ya aceptada se ejecuta más rápidamente:

%%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

mientras

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


No es necesariamente el más elegante, pero he usado variaciones de

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

en el pasado.


Qué pasa

c = np.stack((a,b), axis=3)