Array Problem

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
Juggle5
User
Beiträge: 2
Registriert: Dienstag 10. Januar 2012, 19:24

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 8),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.
anogayales
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
problembär

anogayales hat geschrieben:das sieht mir stark nach Hausaufgaben aus?
Echt? Mit numpy und so? Wäre schon ein bißchen exotisch; aber natürlich möglich.
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
BlackJack

@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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Aber er kämpft doch laut eigener Aussage für Artikel 5 GG! Einer muss das ja tun... :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
problembär

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.
Ok, so kann man das wohl sagen. :P

Obwohl in dem Buch, das ich benutze, "Python GE-PACKT", auch sehr viel anhand von Beispielen mit

Code: Alles auswählen

a = ...
usw. erklärt wird (nicht viel PEP-8 dort also). 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. ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

problembä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. ;)
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 geirrt ;-)

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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].
Ohne numpy hätte ich da so etwas:

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]]
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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.
lunar

@webspider: Selbst in Java und C++ würde man heute eleganteren Code schreiben.
Juggle5
User
Beiträge: 2
Registriert: Dienstag 10. Januar 2012, 19:24

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Juggle5 hat geschrieben:Besonders an \me, dessen Lösung sehr elegant wirkt.
Es hat sich beim Test alles ein wenig verkleinert.

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).
problembär

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.
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.

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";
}
Python:

Code: Alles auswählen

a = (1, 2, 3)
for i in a:
    print i
Das ist einfach ein enormer Vorteil *. Ich habe sogar mal in einem Perl-Forum vorgeschlagen, dies in der neuen Perl-Version "Perl 6" (an der schon seit 10 Jahren gearbeitet wird) von Python zu übernehmen, bin dabei aber in der sonst wie gesagt freundlichen Perl-Community auf erstaunlich große Ablehnung gestoßen. Weitere Vorteile von Python sind hier dargestellt. Das ist überzeugend. Python ist technisch die bessere Sprache. Leider führt der Satz aus dem "Zen of Python"
There should be one-- and preferably only one --obvious way to do it.
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.

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).
BlackJack

@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:

Code: Alles auswählen

my @a = (1, 2, 3);
print "$_\n" for (@a);
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.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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.
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.

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

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]
Oder ggf. nachträglich sortieren:

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

EyDu hat geschrieben:Wenn die Reihenfolge der Schlüssel nicht wichtig ist, dann kann man dies auch direkt über defaultdicts lösen
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:
problembä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. ;)
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 geirrt ;-)
One Godwin point for you, sir! :P
problembär hat geschrieben:Leider führt der Satz aus dem "Zen of Python"
There should be one-- and preferably only one --obvious way to do it.
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.
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!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

problembär hat geschrieben:Mich interessiert numpy eigentlich nicht, da ich mit normalem Python immer ausgekommen bin. Ich würde die Datentypen also konvertieren.
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... :D

_____

¹ Achja, stimmt. Numpy interessiert dich ja nicht. Du bist echt mal gelebte Ignoranz in Reinform. ^^
Antworten