Array-addition

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
RcReese
User
Beiträge: 8
Registriert: Donnerstag 21. November 2019, 18:15

Hallo ich habe ein eher triviales Problem komme aber grade beim besten Willen nicht auf die Lösung...

Ich möchte aus einem dictionary verschiedene Einträge auslesen (jeder dieser Einträge ist ein array mit 8760 Spalten) und diese Einträge (bzw. arrays dann addieren, so dass schlussendlich ein einzelner array mit 8760 Spalten entsteht.

Das auslesen aus dem dictionary habe ich wie folgt gelöst:

Code: Alles auswählen

sum_presence=[]
for k in range (len(zones)):
    sum_presence.append(dic[zones[k]][3]) 
Wie kann ich die einzelnen arrays jetzt addieren?
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Listen (das ist, was du mit [] erzeugst) haben eine 'extend'-Methode, die sollte dir hier weiterhelfen. Abgesehen davon, kannst du gleich über das Objekt iterieren, ohne Indices
Zuletzt geändert von nezzcarth am Dienstag 26. November 2019, 18:01, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RcReese: In Deinem anderen Thema wurde schon mal gesagt das man in Python *direkt* über die Elemente von Sequenzen iteriert, ohne den Umweg über einen Index:

Code: Alles auswählen

    sum_presence = []
    for zone in zones:
        sum_presence.append(dic[zone][3])
Beziehungsweise als „list comprehension“ in einer Zeile:

Code: Alles auswählen

    sum_presence = [dic[zone][3] for zone in zones]
`dic` ist kein guter Name, weil der nichts darüber verrät was die Schlüssel/Werte in dem Wörterbuch *bedeuten*. Aus dem gleichen Grund ist die ”magische” 3 nicht gut. Dafür könnte man eine aussagekräftige Konstante definieren. Oder einen eigenen Datentyp für die Werte die in dem Wörterbuch gespeichert sind.

Arrays kann man mit ``+`` addieren, wenn Du mit ”Array” Numpy-Arrays meinst und nicht schon wieder Listen – die keine Arrays sind.

Ansonsten geht addieren von Zahlen mit ``+``. Und wenn man Listen elementweise addieren möchte, muss man eben genau das tun: Die Elemente der beiden Listen addieren. `map()`, `operator.add()`, und `list()` sind da die passenden Bausteine. Wenn man eine Funktion geschrieben hat die zwei Listen elementweise addiert, kann man `functools.reduce()` verwenden um viele von diesen Listen mit Hilfe dieser Funktion aufzuaddieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
RcReese
User
Beiträge: 8
Registriert: Donnerstag 21. November 2019, 18:15

@__blackjack__
Kannst du mir kurz sagen wieso das so wichtig ist, dass man den Umweg über den Index sein lässt? Ich persönlich finde es so für mich übersichtlicher/verständlicher und das Resultat ist im Endeffekt ja genau das gleiche?

Dass 'dic' kein guter Name ist da hast du natürlich Recht, den wollte ich auch definitiv noch ändern.

Ja, wenn ich 'Arrays' schreibe meine ich Numpy-Arrays, diese sind auch so in Pycharm deutlich als {array} gekennzeichnet. Dass man diese recht einfach über den "+"-Operator addieren kann ist mir klar, das geht aber nur wenn ich vorher weiß wieviele arrays ich addieren möchte. Da sich die Anzahl der zu addierenden arrays hier aber ändern wird suche ich einen Weg wie ich das gescheit machen kann.

Bei den von dir vorgeschlagenen Lösungen über map() oder operator.add() habe ich dann das Problem, dass ja mindestens 2 Argumente eingegeben werden müssen; auch hier weiß ich dann nicht weiter, da ich aufgrund der veränderlichen Anzahl der Arrays in der Liste ja nicht einfach sagen kann addiere Zeile 1 zu Zeile 2.
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@RcReese: Der Umweg über einen unnötigen Index ist halt umständlicher und eigentlich auch nur ”übersichtlicher” wenn man es gewohnt ist es umständlicher zu machen. Und es ist unflexibler weil dafür das Objekt über dessen Elemente man iterieren möchte sowohl eine abfragbare Länge als auch Indexzugriff mit ganzen Zahlen bieten muss. Wenn man direkt über die Elemente iteriert kann das wirklich jedes beliebige iterierbare Objekt sein.

Wieso musst Du wissen wie viele Arrays Du addieren musst? Es gibt ja so etwas wie Schleifen. Aber auch das braucht man nicht selbst machen, denn wenn ``+`` geht braucht man gar nicht `reduce()` und sich selbst eine Funktion schreiben, sondern kann einfach die `sum()`-Funktion verwenden:

Code: Alles auswählen

    result = sum(dic[zone][3] for zone in zones)
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten