Numpy Arrays Speichern und Laden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Hallo zusammen,

ich habe numpy arrays (type numpy.ndarray) der Form array([[x],[y],[z]]), mit float Werten. Nach etwas rumprobieren klappt das Speicher und Laden nun so:

Code: Alles auswählen

def save_numpy(data1, data2):
    numpy.savez('test_numpy', data1, data2)
    
def load_numpy():
    data = numpy.load('test_numpy.npz')
    return [data['arr_0'], data['arr_1']]
Nun hätte ich das ganze aber gerne etwas flexibler, damit ich beliebig viele arrays übergeben kann. Nur bekomme ich das nicht über Listen hin. Beim Speichern schaffe ich es nicht die Liste zu übergeben, ohne sie händisch zu zerlegen und beim Laden steht in der Liste wieder nur ['arr_0', 'arr_1'] drin.

Code: Alles auswählen

def save_numpy_list(data):
    numpy.savez('test_liste', data[0], data[1])
    
def load_numpy_list():
    liste = []
    datas = numpy.load('test_liste.npz')
    for data in datas:
        liste.append(data)
    return liste
Kann mir jemand sagen, wie ich das am Besten hinbekommen kann?

Schon einmal vielen Dank!
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Vermutlich musst du savez die Liste entpackt übergeben. Beim Einlesen bekommst du ein dict-artiges (NpzFile) Objekt, von dem du nur die Werte willst (deine Lösung lieferte nur die Schlüssel).
Ungetestet (ich kenne NpzFile nicht gut genug):

Code: Alles auswählen

def save_numpy_list(data):
    numpy.savez('test_liste', *data)
    
def load_numpy_list():
    return list(numpy.load('test_liste.npz').values())
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Danke schön, dann werde ich das mal testen und mich doch mal mit dem '*' beschäftigen, um zu verstehen was der genau macht.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bords0: Wobei ich vorsichtig wäre eine Annahme über die Reihenfolge von den `values()` zu treffen, sofern das nicht irgendwo in der Dokumentation garantiert wird.

Edit: Das Objekt was man da bekommt muss man auch wieder schliessen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Die Übergabe mithilfe von *data funktioniert auf jeden Fall :)
Bei meinem Minnibeispiel hat das mit values() auch geklappt. Was ich gelesen habe, scheint values() aber eher dafür zu sein die Values eines Dictionarys nach den Keys sortiert auszugeben. Eine Aussage, wie die Reihenfolge ausserhalb von Dictionarys ist, habe ich bisher leider nicht gefunden.
Weiß das jemand genauer oder kennt eine Alternative?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Gehst du davon aus, dass .values() eine eingebaute Funktion ist? Dem ist nicht so.
Ich kenne auch keine .values()-Funktion die dafür sorgt, dass Values eines Dicts nach Keys sortiert ausgegeben werden. Da musst du etwas falsch verstanden haben. Dicts habe neine Funktion .values() aber die macht nicht, was du beschreibst.

Was die Funktion .values() in deinem Fall macht, hängt davon ab, was numpy.load() für ein Objekt zurück gibt. Und dann kannst du nachschauen, ob dieses Objekt eine Funktion .values() hat und was die tut. Entweder in der entsprechend Dokumentation oder mit dem Befehl "help" im interaktiven Interpreter.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du die Dokumentation zu savez oder load gelesen?

Da steht zum einen, dass load ein Wörterbuch-ähnliches Objekt zurückliefert (@sparrow: die Reihenfolge der Werte, die von values() zurückgegeben wird, ist die selbe, wie die dazugehörigen Schlüssel, die von keys() zurückgegeben werden).
Dieses Objekt muß auch wieder geschlossen werden. Wie man das am besten macht, steht auch in der Dokumentation als Beispiel.

Welche Schlüssel in die Datei geschrieben werden, ist in savez beschrieben, auch wie die heißen, wenn man keine explizit angibt. Hast Du aber explizite Namen für die Arrays, solltest Du diese auch beim Schreiben benutzen.

Kannst Du noch näher beschreiben, was das für Daten sind, die Du speichern willst?
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Ich werde mir am Wochenende wohl echt mal die Zeit nehmen die Dokus ordentlich zu lesen, anstatt sie nur zu überfliegen.

@ Sirius3: Ich habe mal ein Einsteigerbuch über Neuronale Netze geschenkt bekommen und nun wollte ich die Gewichtungen der Pfade in eine Datei speichern.
Heute Abend kann ich nachschauen, wie die Arrays aufgebaut werden, so exakt habe ich das leider nicht im Kopf.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Sirius3 hat geschrieben: Freitag 27. September 2019, 08:17 Welche Schlüssel in die Datei geschrieben werden, ist in savez beschrieben, auch wie die heißen, wenn man keine explizit angibt. Hast Du aber explizite Namen für die Arrays, solltest Du diese auch beim Schreiben benutzen.
Damit habe ich rumgespielt und das hat auch so geklappt. Wenn ich das jetzt aber mit der Anzahl der Arrays flexibel handhaben will und sie daher mit *data übergebe, muss ich ja die Namen der Arrays als **kwrds übergeben. Da scheitert es mir gerade am Verständnis...
Ich hätte jetzt nämlich so etwas versucht

Code: Alles auswählen

def save_list(data, keywords):
    numpy.savez('test_list', *data, **keywords)
    
save_list((data0, data1), [data0:'arr0', data1:'arr1'])
Was natrürlich zu einem Fehler führt :roll:
Sirius3 hat geschrieben: Freitag 27. September 2019, 08:17 Kannst Du noch näher beschreiben, was das für Daten sind, die Du speichern willst?
Wie gestern schon geschrieben, geht es um Gewichtungen von Pfaden zwischen den Schichten mit den (Nerven-)Knoten. Zur Zeit habe ich eine Eingangs-, eine Zwischen- und eine Ausgangsschicht. Da ich aber mit der Anzahl der Zwichenschichten etwas rumspielen wollte, wollte ich das Speichern und Laden möglichst flexibel handhaben, so dass ich es nicht immer händisch anpassen muss.
Das Array für die Gewichtungen wird (zur Zeit noch) in etwas initialisiert:

Code: Alles auswählen

weighting_input_interlayer = numpy.random.rand(count_interlayer, count_inputs) - 0.5
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Code: Alles auswählen

save_list((data0, data1), [data0:'arr0', data1:'arr1'])
  File "<ipython-input-34-a635441e8102>", line 1
    save_list((data0, data1), [data0:'arr0', data1:'arr1'])
                                    ^
SyntaxError: invalid syntax
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Zizibee: Echt jetzt…

Arbeite am besten mal ein Python-Grundlagentutorial durch.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten