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