Wie kann ich dies in numpy pythonisch machen?
Das Folgende ist ein auf das Wesentliche reduziertes real-world Problem, bloß mit geringeren Dimensionen.
Sagen wir, ich möchte ein n-dimensionales Array "all" erzeugen mit den Dimensionen (10, 10, 100)
all = np.empty((10, 10, 100))
weiters habe ich ein 1d array, hier simuliert als
data = np.arange(0, 100)
für alle i, j möchte ich nun erreichen dass
all[i,j]=data
Also mache ich:
all[:, :]=data
Das funktioniert natürlich.
Aber nun möchte ich data auf ein shape (100, 10, 10) einspielen. Das kann ich ja machen mit
all2 = np.empty((100, 10, 10)) # neues Zeiel
for i in range(100):
for j in range(10):
for k in range(10):
all2[i, j, k]=data[i]
Aber geht das auch einfacher ohne zu loopen? Würde mich wundern, wenn das nicht eleganter ginge, aber ich sehe nicht wie.
Sehe gerade: es geht mit transponieren
all2.T[:,:] = data
1 Antwort
Versuch es doch mal mit dem "buffer"-Parameter im ndarray-Konstruktor.
https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray
Ob es funktioniert lässt sich aufgrund der unzureichenden Dokumentation des numpy-APIs nicht vorab sagen.
Ansonsten gibt es auch noch "put":
https://numpy.org/doc/stable/reference/generated/numpy.ndarray.put.html#numpy.ndarray.put
Für genaueres siehe auch:
ich denke da müsste es eine art list comprehension mit elegantem slicing geben.
Was wahrscheinlich arschlahm ist. Aber gut, du verwendest sowieso Python, von daher...
Aber es steht da, dass der ndarray intern ein 1d-Array ist, insofern sehe ich wirklich nicht, wieso man das komplizierter machen sollte (sofern denn dein 1d-Array im Speicher passend abgelegt ist).
Ich habe herausgefunden, wie es geht. Ob das die performanteste Variante ist, weiß ich nicht, aber mein originales Datenarray ist in Millisekunden geschrieben. Ich weiß, dass es auch mit deiner Idee gehen könnte, nur will mich nicht in die innersten Eingeweiden von numpy hineinarbeiten, da ich auch was anderes zu tun habe.
Ich könnte das 3d array auch gleich so erzeugen:
all2 = np.tile(data, (10,10,1)).T
Das ergibt das selbe.
Bei 500MByte Daten dauert das unmerkbar lange (~ms)
ich denke dass dies sehr low-level wäre.
das andere muss ich anschauen.