Aplatir une liste de tableaux NumPy?
Il semble que j'ai des données au format d'une liste de tableaux 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]])]
J'essaie de mettre cela dans une fonction polyfit:
m1 = np.polyfit(x, y, deg=2)
Cependant, elle renvoie l'erreur: TypeError: expected 1D vector for x
Je suppose que j'ai besoin d'aplatir mes données en quelque chose comme:
[0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654 ...]
J'ai essayé une compréhension de liste qui fonctionne habituellement sur des listes de listes, mais cela comme prévu n'a pas fonctionné:
[val for sublist in risks for val in sublist]
Quelle serait la meilleure façon de le faire?
2 réponses
Vous pouvez utiliser numpy.concatenate
, qui comme son nom l'indique, essentiellement concatène tous les éléments d'une liste d'entrées dans un seul tableau NumPy, comme soi -
import numpy as np
out = np.concatenate(input_list).ravel()
Si vous souhaitez que la sortie finale soit une liste, vous pouvez étendre la solution, comme ceci -
out = np.concatenate(input_list).ravel().tolist()
Exécution de L'échantillon -
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 en liste -
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]
Je suis tombé sur ce même problème et j'ai trouvé une solution qui combine des tableaux numpy 1-D de longueur variable:
np.column_stack(input_list).ravel()
Voir numpy.column_stack pour plus d'informations.
Exemple avec des tableaux de longueur variable avec vos données d'exemple:
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])
Note: testé uniquement sur Python 2.7.12