web-dev-qa-db-fra.com

Aplatissement d'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, 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?

28
Jerry Zhang

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]
21
Divakar

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]
0
ayorgo

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

0
zsatter14