Concatenar lista anidada de matriz con sublistas parcialmente vacías.
El objetivo es concatenar una lista anidada de arreglos (es decir, list_arr
). Sin embargo, algunas de las sublistas dentro de list_arr
tienen longitud cero.
Simplemente usando np.array
o np.asarray
en list_arr
no produce el resultado deseado.
import numpy as np
ncondition=2
nnodes=30
nsbj=6
np.random.seed(0)
# Ejemplo de lista anidada list_arr
list_arr=[[[np.concatenate([[idx_sbj],[ncondi],[nepoch] ,np.random.rand(nnodes)]) for nepoch in range(np.random.randint(5))] \
for ncondi in range(ncondition)] for idx_sbj in range(nsbj)]
Lo siguiente no produce la salida de concatenación esperada
test1=np.asarray(list_arr)
test2=np.array(list_arr)
test3= np.vstack(list_arr)
La salida esperada es una matriz de formas (15,33)
davy.ai
Para concatenar una lista anidada de arreglos, se puede utilizar la función
np.concatenate
en cada sublista dentro de la listalist_arr
y luego concatenar los arreglos resultantes. Sin embargo, cuando algunas de las sublistas tienen una longitud cero, simplemente utilizarnp.array
onp.asarray
en la listalist_arr
no produce el resultado previsto, ya que crea un array de dimensiones más altas de listas en lugar de un único array.Una solución es filtrar las sublistas vacías antes de concatenar. Podemos hacer esto utilizando una comprensión de lista dentro de la llamada a la función
np.concatenate
. Aquí hay un ejemplo:Aquí, primero filtramos las sublistas vacías utilizando una comprensión de lista
[arr for arr in list_arr if len(arr) > 0]
. Luego, concatenamos cada sublista no vacía utilizando otra comprensión de lista[np.concatenate(filtered_arr) for filtered_arr in filtered_list_arr]
. Finalmente, concatenamos los arreglos resultantes utilizandonp.concatenate
nuevamente.La salida debería ser un arreglo de forma
(15, 33)
, que es la salida esperada de la concatenación.