web-dev-qa-db-de.com

Reduzieren einer Liste von NumPy-Arrays?

Es scheint, dass ich Daten im Format einer Liste von NumPy-Arrays (type() = np.ndarray) habe:

[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]])]

Ich versuche, dies in eine Polyfit-Funktion zu integrieren:

m1 = np.polyfit(x, y, deg=2)

Es wird jedoch der Fehler zurückgegeben: TypeError: expected 1D vector for x

Ich gehe davon aus, dass ich meine Daten wie folgt zusammenfassen muss:

[0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654 ...]

Ich habe ein Listenverständnis ausprobiert, das normalerweise mit Listenlisten funktioniert, aber dies hat wie erwartet nicht funktioniert

[val for sublist in risks for val in sublist]

Was wäre der beste Weg, dies zu tun?

28
Jerry Zhang

Sie könnten numpy.concatenate verwenden, das, wie der Name vermuten lässt, grundsätzlich alle Elemente einer solchen Eingabeliste in einem einzigen NumPy-Array verkettet,

import numpy as np
out = np.concatenate(input_list).ravel()

Wenn Sie möchten, dass die endgültige Ausgabe eine Liste ist, können Sie die Lösung wie folgt erweitern:

out = np.concatenate(input_list).ravel().tolist()

Probelauf -

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])

In Liste konvertieren -

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

Ein weiterer einfacher Ansatz wäre die Verwendung von numpy.hstack() , gefolgt vom Entfernen der Singleton-Dimension mit squeeze() wie in:

In [61]: np.hstack(list_of_arrs).squeeze()
Out[61]: 
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])
2
kmario23

Kann auch von gemacht werden

np.array(list_of_arrays).flatten().tolist()

ergebend

[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

Eine andere Möglichkeit, itertools zum Reduzieren des Arrays zu verwenden:

import itertools

# Recreating array from question
a = [np.array([[0.00353654]])] * 13

# Make an iterator to yield items of the flattened list and create a list from that iterator
flattened = list(itertools.chain.from_iterable(a))

Diese Lösung sollte sehr schnell und speichereffizient sein, siehe https://stackoverflow.com/a/408281/5993892 für weitere Erklärungen.

Wenn die resultierende Datenstruktur stattdessen ein numpy -Array sein soll, verwenden Sie numpy.fromiter(), um den Iterator in ein Array umzuwandeln:

# Make an iterator to yield items of the flattened list and create a numpy array from that iterator
flattened_array = np.fromiter(itertools.chain.from_iterable(a), float)

Dokumente für itertools.chain.from_iterable(): https://docs.python.org/3/library/itertools.html# itertools.chain.from_iterable

Dokumente für numpy.fromiter(): https://docs.scipy.org/doc/numpy/reference/generated/ numpy.fromiter.html

0

Ich bin auf das gleiche Problem gestoßen und habe eine Lösung gefunden, die 1-D-numpy-Arrays variabler Länge kombiniert:

np.column_stack(input_list).ravel()

Siehe numpy.column_stack für weitere Informationen.

Beispiel mit Arrays variabler Länge mit Ihren Beispieldaten:

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])

Hinweis: Nur auf Python 2.7.12 getestet

0
zsatter14