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, il renvoie l'erreur: TypeError: expected 1D vector for x
Je suppose que j'ai besoin d'aplanir 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 n'a pas fonctionné comme prévu:
[val for sublist in risks for val in sublist]
Quelle serait la meilleure façon de faire cela?
Vous pouvez utiliser numpy.concatenate
, qui, comme son nom l'indique, concatène en principe tous les éléments d'une telle liste d'entrées dans un seul tableau NumPy, comme suit -
import numpy as np
out = np.concatenate(input_list).ravel()
Si vous souhaitez que le résultat final soit une liste, vous pouvez étendre la solution, comme ceci -
out = np.concatenate(input_list).ravel().tolist()
Exemple de cycle -
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]
Peut aussi être fait par
np.array(list_of_arrays).flatten().tolist()
résultant en
[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 le même problème et j'ai trouvé une solution qui combine des tableaux numpy à une dimension 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])
Remarque: testé uniquement sur Python 2.7.12