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?

26
demandé sur Jerry Zhang 2015-11-14 21:44:51

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]
21
répondu Divakar 2015-11-15 11:02:04

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

0
répondu zsatter14 2018-08-20 15:53:42