es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para concatenar una lista anidada de arreglos, se puede utilizar la función np.concatenate en cada sublista dentro de la lista list_arr y luego concatenar los arreglos resultantes. Sin embargo, cuando algunas de las sublistas tienen una longitud cero, simplemente utilizar np.array o np.asarray en la lista list_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:

    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)]
    
    # Concatenar sublistas no vacías
    filtered_list_arr = [arr for arr in list_arr if len(arr) > 0]
    concatenated_arr = np.concatenate([np.concatenate(filtered_arr) for filtered_arr in filtered_list_arr])
    
    print(concatenated_arr.shape)  # (15, 33)
    

    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 utilizando np.concatenate nuevamente.

    La salida debería ser un arreglo de forma (15, 33), que es la salida esperada de la concatenación.

Comments are closed.