Emita la lista de conversión a NumPy array

Tengo una lista que consta de 2000 filas y 88200 columnas:

testlist = list(split_audio_to_parts(audio, self.sample_rate, self.audio_index)) 

salida de depuración de testlist da

 [array([-0.00683594, -0.00689697, -0.00708008, ..., 0. , 0. , 0. ]), array([-0.01287842, -0.01269531, -0.01257324, ..., 0. , 0. , 0. ]), array([0.02288818, 0.01940918, 0.01409912, ..., 0. , 0. , 0. ]), array([0.00772095, 0.00671387, 0.00695801, ..., 0. , 0. , 0. ]), 

y así. split_audio_to_parts es una función:

 def split_audio_to_parts(x, sample_rate, audio_index): for i, row in audio_index.iterrows(): x_part = x[int(row['start_samples']):int(row['end_samples'])] yield x_part 

Cuando trato de convertirlo en una matriz numpy usando samples = np.array(testlist) o samples = np.asarray(testlist) , me da un array de shape (2000,), aunque la depuración muestra que el testlist de 2000 entradas con 88200 posiciones ¿Porque? Estoy usando 64bit numpy y 64bit Python 3.6.5.

El problema es que testlist es una lista de matrices de diferentes tamaños. Por ejemplo, compruebe este código:

 >>>import numpy as np >>>import random >>>random.seed(3240324324) >>> y=[np.array(list(range(random.randint(1,3)))) for _ in range(3)] >>> y [array([0, 1, 2]), array([0, 1, 2]), array([0])] >>> np.array(y) array([array([0, 1, 2]), array([0, 1, 2]), array([0])], dtype=object) >>> np.array(y).shape (3,) 

y la matriz sería de tipo object lugar de flotante. La única manera de que esto funcione es tener matrices del mismo tamaño.

Si realmente necesitas rellenar estas filas de alguna manera en una matriz, puedes rellenar con ceros, por ejemplo:

 >>> size = y[max(enumerate(y),key=lambda k:k[1].shape)[0]].shape[0] >>> z=[np.append(x,np.zeros(size-x.shape[0])) for x in y] >>> z [array([ 0., 1., 2.]), array([0, 1, 2]), array([0, 0, 0])] >>>np.array(z).shape (3, 3) 

pero tendrías que decidir cómo hacer este relleno.

Tienes una lista de arrays. Si cada matriz en su lista no tiene la misma longitud, su conversión no tendrá éxito.

Aquí hay un ejemplo mínimo.

 A = [np.array([1, 2]), np.array([4, 5, 6])] A_2 = np.array(A) # array([array([1, 2]), array([4, 5, 6])], dtype=object) A_2.shape # (2,) 

Si las longitudes de sus matrices están alineadas, no encontrará ningún problema:

 B = [np.array([1, 2, 3]), np.array([4, 5, 6])] B_2 = np.array(B) # array([[1, 2, 3], # [4, 5, 6]]) B_2.shape # (2, 3) 

Para verificar los tamaños de sus arreglos, puede usar set :

 array_sizes = set(map(len, A))