Hallo,
ich habe folgendes Problem:
ich habe die arrays [0,1,1,2,3,4,4,5] und [12,8,10,13,5,4,7,9] (also zwei arrays mit gleicher anzahl an indices in numpy)
nun hätte ich gerne das aus erstem array der folgende array wird [0,1,2,3,4,5] und aus dem zweiten array der array [12,18 (also die 10 + die ,13,5,11 (die 4 + 7),9].
in worten zusammengefasst:
alle indexpositionen an denen im ersten array eine 1 steht sollen zu einer zusammengefasst werden (also nur eine 1). im korrespondierenden array sollen die zahlenwerte an den entsprechenden indexpositionen addiert werden und somit auch zu einer zahl zusammengefasst werden (die dann an der gleichen indexposition steht wie die 1 im ersten array).
wenn mir hierbei jemand helfen könnte wäre ich euch sehr dankbar.
vielen dank schon mal!
Philip
falls ich mich unklar ausgedrückt habe kann ich nochmal versuchen ein anderes beispiel zu geben.
Array Problem
-
- User
- Beiträge: 456
- Registriert: Mittwoch 15. April 2009, 14:11
Hi,
das sieht mir stark nach Hausaufgaben aus? Zeig doch mal was du bisher hinbekommen hast. Dir einfach die Lösung hinzuklatschen würde dir ja nicht viel bringen.
Grüße,
anogayales
das sieht mir stark nach Hausaufgaben aus? Zeig doch mal was du bisher hinbekommen hast. Dir einfach die Lösung hinzuklatschen würde dir ja nicht viel bringen.
Grüße,
anogayales
Echt? Mit numpy und so? Wäre schon ein bißchen exotisch; aber natürlich möglich.anogayales hat geschrieben:das sieht mir stark nach Hausaufgaben aus?
Mich interessiert numpy eigentlich nicht, da ich mit normalem Python immer ausgekommen bin. Ich würde die Datentypen also konvertieren. Bei mir sieht das dann so aus (bekanntlich interessiert mich auch PEP-8 nicht oder was ihr sonst zum Stil sagt (also bitte ggf. nur auf etwaige Fehler im Algorithmus oder ähnliches aufmerksam machen, den Rest überlese ich jedenfalls, können sich von mir aus andere drüber zanken)):
Code: Alles auswählen
#!/usr/bin/python
# coding: iso-8859-1
import numpy
# Ausgangspunkt sind Numpy-Arrays:
a = numpy.array([0,1,1,2,3,4,4,5])
b = numpy.array([12,8,10,13,5,4,7,9])
a = list(a)
b = list(b)
c = []
d = []
i = 0
while i < len(a):
e = b[i]
x = 1
while i < len(a) - x and a[i] == a[i + x]:
e += b[i + x]
x += 1
i += 1
c.append(a[i])
d.append(e)
i += 1
c = numpy.array(c)
d = numpy.array(d)
print c
print d
@problembär: `numpy` ist bei naturwissenschaftlichen Studiengängen nicht exotisch. Wenn Python eingesetzt wird, dann ist es eher Standard.
@Juggle5: Was den Stil angeht solltest Du bei der Lösung von problembär beachten, dass er die absichtlich so „unpythonisch“ wie möglich geschrieben hat. Er schreibt gerne in einer Art die möglichst weit von dem entfernt ist, was allgemein empfohlen wird.
@Juggle5: Was den Stil angeht solltest Du bei der Lösung von problembär beachten, dass er die absichtlich so „unpythonisch“ wie möglich geschrieben hat. Er schreibt gerne in einer Art die möglichst weit von dem entfernt ist, was allgemein empfohlen wird.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Aber er kämpft doch laut eigener Aussage für Artikel 5 GG! Einer muss das ja tun...BlackJack hat geschrieben: @Juggle5: Was den Stil angeht solltest Du bei der Lösung von problembär beachten, dass er die absichtlich so „unpythonisch“ wie möglich geschrieben hat. Er schreibt gerne in einer Art die möglichst weit von dem entfernt ist, was allgemein empfohlen wird.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ok, so kann man das wohl sagen.BlackJack hat geschrieben:Was den Stil angeht solltest Du bei der Lösung von problembär beachten, dass er die absichtlich so „unpythonisch“ wie möglich geschrieben hat. Er schreibt gerne in einer Art die möglichst weit von dem entfernt ist, was allgemein empfohlen wird.
Obwohl in dem Buch, das ich benutze, "Python GE-PACKT", auch sehr viel anhand von Beispielen mit
Code: Alles auswählen
a = ...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wenn da alle Rezensionisten so informiert sind über Python wie Du, dann kann es schon sein, dass sich eine Vielzahl irrt. Man soll es ja nicht ausreizen, aber 1933 haben sich auch viele geirrtproblembär hat geschrieben:Das Buch dürfte bei euch dann wohl auch auf der schwarzen Liste stehen; nur hat's dort bei 17 Amazon-Kundenrezensionen mehr als 4 von 5 möglichen Sternen. Wahrscheinlich sind da alle im Irrtum.
Davon abgesehen galt dieses Buch iirc als ganz ok. Und ein `a = ...` ist erst einmal nicht unbedingt unpythonisch - es kommt eben auf den Kontext an, in welchem man diesen Namen verwendet. BlackJack kritisierte bei Dir auch eher anderes, speziell die beiden Namen `a` und `b` finde ich hier nicht wirklich daneben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Ohne numpy hätte ich da so etwas:Juggle5 hat geschrieben:ich habe die arrays [0,1,1,2,3,4,4,5] und [12,8,10,13,5,4,7,9] (also zwei arrays mit gleicher anzahl an indices in numpy)
nun hätte ich gerne das aus erstem array der folgende array wird [0,1,2,3,4,5] und aus dem zweiten array der array [12,18 (also die 10 + die 8 ),13,5,11 (die 4 + 7),9].
Code: Alles auswählen
import itertools
from operator import itemgetter
data_key = [0,1,1,2,3,4,4,5]
data_val = [12,8,10,13,5,4,7,9]
groups = itertools.tee(
itertools.groupby(itertools.izip(data_key, data_val), key=itemgetter(0)))
data_val = [sum(element[1] for element in group) for key, group in groups[0]]
data_key = [key for key, group in groups[1]]
Nein, es handelt sich nicht um eine Hausaufgabe
Ich beschäftige mich momentan mit Bildverarbeitung und da wäre die genannte Operation wichtig.
Vielen Dank euch Allen!
Besonders an \me, dessen Lösung sehr elegant wirkt.
Also Danke nochmal, ich werde jetzt mal versuchen das ganze in meinen Code einzubauen.
Schönen Gruß,
Philip
Ich beschäftige mich momentan mit Bildverarbeitung und da wäre die genannte Operation wichtig.
Vielen Dank euch Allen!
Besonders an \me, dessen Lösung sehr elegant wirkt.
Also Danke nochmal, ich werde jetzt mal versuchen das ganze in meinen Code einzubauen.
Schönen Gruß,
Philip
Es hat sich beim Test alles ein wenig verkleinert.Juggle5 hat geschrieben:Besonders an \me, dessen Lösung sehr elegant wirkt.
Ursprünglich hatte ich eine Variante mit einem defaultdict angedacht.
Wenn Fragen zum Ausdruck da sind: wir sind hier (und die Dokumentation zu itertools ist da).
Dankeschön! C/C++ und auch Java hab' ich mir natürlich auch schon mal angesehen. Alle drei sind natürlich mächtige Sprachen, die sich auch gut für große Programmierteams eignen. Gegenüber Python muß man aber sehr viel mehr Code schreiben, um dasselbe zu erreichen. Z.B. in C zu denken, ist auch sehr viel schwieriger und dauert (daher) länger. Python hat ja das Ziel, die Sache für den Programmierer besonders schnell und einfach zu machen.webspider hat geschrieben:Ich glaube der Problembär wäre mit C/C++/Java viel besser bedient, denn dort gilt solcher Code als annehmbar und läuft ganz gut.
Eine Alternative für mich wäre Perl, das hinsichtlich der dynamischen Datentypen (vor allem Listen) mit Python viel gemeinsam hat. Dort sind sehr viele Code-Konstrukte akzeptiert, das mag ich sehr, und die Community ist sehr offen, hilfsbereit und nett.
Der Grund, warum ich mich doch für Python entschieden habe, ist, daß man bei Python nochmal weniger tippen muß: Python zeigt, daß man auf Klammern ({}) und Semikola am Zeilenende und sogar auf Sigils zur Unterscheidung der Datentypen verzichten kann (und dadurch den Code sogar auch noch sauberer und besser lesbar machen kann):
Perl:
Code: Alles auswählen
my @a = (1, 2, 3);
my $i;
foreach $i (@a) {
print "$i\n";
}
Code: Alles auswählen
a = (1, 2, 3)
for i in a:
print i
offenbar zu einem gewissen starren Dogmatismus. Wenn man hier ein wenig von der im Perl-Lager üblichen Toleranz übernehmen könnte, wäre viel gewonnen. Vielleicht stoße ich aber auch nur hier auf diese Schwierigkeiten. Ich denke, ich werde mich mal hier umsehen.There should be one-- and preferably only one --obvious way to do it.
Grüße vom Problembären
P.S.: Sorry für Off-Topic, aber das Thema selbst war ja schon gelöst.
* Wobei das "print()" mit den Klammern (Funktion) von Python 3.x natürlich kontraproduktiv und ein Schritt in die falsche Richtung ist (nämlich wieder mehr tippen zu müssen).
@problembär: Das Ziel beim Entwurf von Python war und ist nicht Zeichen einzusparen und möglichst wenig tippen zu müssen, sondern verständlichen und wartbaren Quelltext schreiben zu können. Wenn es um wenig Zeichen ginge, dann hätte man zum Beispiel die Doppelpunkte vor Blöcken („suites”) weg lassen können. Untersuchungen haben aber gezeigt, dass der Quelltext mit den Doppelpunkten verständlicher ist.
Dementsprechend hat `print()` als Funktion nichts mit mehr oder weniger Zeichen zu tun, sondern damit, dass es sinnvoller ist dafür keinen Sonderstatus einer Anweisung zu haben. Man kann `print` als ganz normalen Wert behandeln. Also zum Beispiel eine eigene Funktion an diesen Namen binden, oder die Funktion als Argument an andere Funktionen übergeben. Dafür wird sowohl die Syntax, als auch der Parser einfacher.
Dein Perl-Quelltext geht auch kürzer — sogar ohne die geschweiften Klammern:
Im Allgemeinen kann man in Perl kürzere Lösungen schreiben als in Python. Wenn es also nur um die Zahl der Zeichen geht, solltest Du Perl besser finden.
Dementsprechend hat `print()` als Funktion nichts mit mehr oder weniger Zeichen zu tun, sondern damit, dass es sinnvoller ist dafür keinen Sonderstatus einer Anweisung zu haben. Man kann `print` als ganz normalen Wert behandeln. Also zum Beispiel eine eigene Funktion an diesen Namen binden, oder die Funktion als Argument an andere Funktionen übergeben. Dafür wird sowohl die Syntax, als auch der Parser einfacher.
Dein Perl-Quelltext geht auch kürzer — sogar ohne die geschweiften Klammern:
Code: Alles auswählen
my @a = (1, 2, 3);
print "$_\n" for (@a);
Ich meinte viel eher, dass bei deinem Python-Programmierstil viel einfacher zu C/C++/Java umwechseln kannst. Python wäre erst dann wesentlich eleganter wenn du alle Features inklusive der funktionalen ausreizen würdest. Da du das nicht kannst/willst/wirst, bleiben nur noch OOP und imperativer Stil übrig.Dankeschön! C/C++ und auch Java hab' ich mir natürlich auch schon mal angesehen. Alle drei sind natürlich mächtige Sprachen, die sich auch gut für große Programmierteams eignen. Gegenüber Python muß man aber sehr viel mehr Code schreiben, um dasselbe zu erreichen. Z.B. in C zu denken, ist auch sehr viel schwieriger und dauert (daher) länger. Python hat ja das Ziel, die Sache für den Programmierer besonders schnell und einfach zu machen.
Perl ist meines Erachtens noch wesentlich zeichensparender auf Kosten der Verständlichkeit. Aber bei dir ist ja wie schon erwähnt nicht das Vorhaben vorhanden wirklich elegante und/oder kurze Lösungen zu nutzen. Widerstrebe also nicht deiner Natur und wechsele zu Java falls dir C/C++ den Finger zeigen sobald du mit Pointern arbeitest.
Hallo.
Wenn die Reihenfolge der Schlüssel nicht wichtig ist, dann kann man dies auch direkt über defaultdicts lösen:
Oder ggf. nachträglich sortieren:
Zur C/C++/Java/Python-Diskussion: Wenn man vernünftiges C++ programmiert, also unter starker Verwendung von std und boost, dann kommt der Code Python bereits recht nahe.
Wenn die Reihenfolge der Schlüssel nicht wichtig ist, dann kann man dies auch direkt über defaultdicts lösen:
Code: Alles auswählen
>>> import collections
>>> data = collections.defaultdict(int)
>>> for index, value in zip(indices, values):
... data[index] += value
...
>>> data.keys()
[0, 1, 2, 3, 4, 5]
>>> data.values()
[12, 18, 13, 5, 11, 9]
Code: Alles auswählen
>>> keys, values = zip(*sorted(zip(data.keys(), data.values())))
>>> keys
(0, 1, 2, 3, 4, 5)
>>> values
(12, 18, 13, 5, 11, 9)
Zur C/C++/Java/Python-Diskussion: Wenn man vernünftiges C++ programmiert, also unter starker Verwendung von std und boost, dann kommt der Code Python bereits recht nahe.
Das Leben ist wie ein Tennisball.
So ähnlich sah auch mein erster Ansatz aus und wenn die Schlüsselreihenfolge wirklich nicht wichtig sein sollte, dann würde ich diese Variante auch gegenüber der von mir gezeigten Lösung mit intensivem itertools-Einsatz bevorzugen.EyDu hat geschrieben:Wenn die Reihenfolge der Schlüssel nicht wichtig ist, dann kann man dies auch direkt über defaultdicts lösen
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
One Godwin point for you, sir!Hyperion hat geschrieben:Wenn da alle Rezensionisten so informiert sind über Python wie Du, dann kann es schon sein, dass sich eine Vielzahl irrt. Man soll es ja nicht ausreizen, aber 1933 haben sich auch viele geirrtproblembär hat geschrieben:Das Buch dürfte bei euch dann wohl auch auf der schwarzen Liste stehen; nur hat's dort bei 17 Amazon-Kundenrezensionen mehr als 4 von 5 möglichen Sternen. Wahrscheinlich sind da alle im Irrtum.
Natürlich, seht dir frei, aber es ist nunmal so dass es sinnvoller ist idiomatischen Code zu schreiben. Vielleicht findest du ja ne Community die das nicht findet, mir würde da vielleicht PHP als Empfehlung einfallen, auf jeden Fall wünsche ich dir viel Erfolg!problembär hat geschrieben:Leider führt der Satz aus dem "Zen of Python"offenbar zu einem gewissen starren Dogmatismus. Wenn man hier ein wenig von der im Perl-Lager üblichen Toleranz übernehmen könnte, wäre viel gewonnen. Vielleicht stoße ich aber auch nur hier auf diese Schwierigkeiten. Ich denke, ich werde mich mal hier umsehen.There should be one-- and preferably only one --obvious way to do it.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ey, jetz mal im Ernst. Das ist ein Scherz, oder? Weißt du überhaupt, wofür man Numpy verwendet?¹ Ich kann's ja noch verstehen, dass man als Anfänger versehentlich Python-Schleifen programmiert, statt die Aufgabe Numpy-intern zu lösen oder sowas, aber die Konvertierung in Python-Listen und spätere Rückumwandlung ist echt der Hammer...problembär hat geschrieben:Mich interessiert numpy eigentlich nicht, da ich mit normalem Python immer ausgekommen bin. Ich würde die Datentypen also konvertieren.
_____
¹ Achja, stimmt. Numpy interessiert dich ja nicht. Du bist echt mal gelebte Ignoranz in Reinform. ^^