python - transponer - ¿Aplanando una lista de matrices NumPy?
sumatoria numpy python (2)
Parece que tengo datos en el formato de una lista de matrices NumPy ( type() = np.ndarray
):
[array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]])]
Estoy tratando de poner esto en una función polyfit:
m1 = np.polyfit(x, y, deg=2)
Sin embargo, devuelve el error: TypeError: expected 1D vector for x
Supongo que necesito aplanar mis datos en algo como:
[0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654 ...]
He intentado una comprensión de lista que normalmente funciona en listas de listas, pero esto no funcionó:
[val for sublist in risks for val in sublist]
Cuál sería la mejor forma de hacer esto?
Encontré este mismo problema y encontré una solución que combina matrices numpy 1-D de longitud variable:
np.column_stack(input_list).ravel()
Ver numpy.column_stack para más información.
Ejemplo con matrices de longitud variable con sus datos de ejemplo:
In [135]: input_list
Out[135]:
[array([[ 0.00353654, 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654, 0.00353654, 0.00353654]])]
In [136]: [i.size for i in input_list] # variable size arrays
Out[136]: [2, 1, 1, 3]
In [137]: np.column_stack(input_list).ravel()
Out[137]:
array([ 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654,
0.00353654, 0.00353654])
Nota: Solo probado en Python 2.7.12
Podría usar numpy.concatenate
, que como su nombre lo indica, básicamente concatena todos los elementos de dicha lista de entrada en una única matriz NumPy, como por ejemplo:
import numpy as np
out = np.concatenate(input_list).ravel()
Si desea que la salida final sea una lista, puede extender la solución, como así:
out = np.concatenate(input_list).ravel().tolist()
Ejecución de la muestra
In [24]: input_list
Out[24]:
[array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]]),
array([[ 0.00353654]])]
In [25]: np.concatenate(input_list).ravel()
Out[25]:
array([ 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654,
0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654,
0.00353654, 0.00353654, 0.00353654])
Convertir a la lista -
In [26]: np.concatenate(input_list).ravel().tolist()
Out[26]:
[0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654,
0.00353654]