numpy und String Array

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
Mr.Mister
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2013, 09:56

Hallo Zusammen,

ich programmiere gerade für die Uni ein Projekt und bin auf folgendes Problem gestoßen:

Code: Alles auswählen

new_Taxon = "AC"
col = numpy.array(["A","B","C"])
col = numpy.delete(col, 0)
col = numpy.delete(col, 2)
col = numpy.insert(col, 0, new_Taxon)
Output: ["A","B"]

Wenn ich folgendes an col ändere:

Code: Alles auswählen

col = numpy.array(["A","B ","C"])
funktionert alles wie es soll.

ich vermute einfach einmal, dass durch das Leerzeichen im zweiten Teil jedes Arrayelement 2 Symbole zugewiesen bekommt, da das einzige vorhandene Element ("B ") auch zwei besitzt und im Ersten nur eines, daher wird mein AC zu A zerschnitten.

Aber wie schaffe ich es jetzt das ganze so variabel zu halten, dass ich beliebig große Elemente hinzufügen kann?

Ich hoffe ihr könnt mir weiterhelfen.

Viele Grüße

Mr.Mister
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mr.Mister: Wenn Du eine Liste von Strings verarbeiten willst, warum nimmst Du dann numpy und nicht einfach eine Python-Liste?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Was ist der genaue Anwendungsfall? Oder anders gefragt: Was genau repräsentieren diese Buchstaben?
BlackJack

@Mr.Mister: Das was Du im ersten Beitrag behauptest kann nicht sein, denn ``col = numpy.delete(col, 2)`` führt ganz offensichtlich zu einer Ausnahme weil Du versuchst etwas zu löschen was es nicht gibt:

Code: Alles auswählen

In [2]: col = numpy.array(["A","B","C"])

In [3]: col
Out[3]: 
array(['A', 'B', 'C'], 
      dtype='|S1')

In [4]: col = numpy.delete(col, 0)

In [5]: col
Out[5]: 
array(['B', 'C'], 
      dtype='|S1')

In [6]: col = numpy.delete(col, 2)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/bj/<ipython-input-6-afaf86f7cd5f> in <module>()
----> 1 col = numpy.delete(col, 2)

/usr/local/lib/python2.7/dist-packages/numpy/lib/function_base.pyc in delete(arr, obj, axis)
   3454         if (obj < 0 or obj >=N):
   3455             raise ValueError(
-> 3456                     "invalid entry")
   3457         newshape[axis]-=1;
   3458         new = empty(newshape, arr.dtype, arr.flags.fnc)

ValueError: invalid entry
Bei Fehlern bitte den *tatsächlichen* Code und den *tatsächlichen* Fehler zeigen. Wenn Du Code zeigst und ein Ergebnis beschreibst was überhaupt nicht dazu passt, kann man schlecht bis gar nicht helfen, sondern höchstens mehr oder weniger informiert raten.

Ansonsten schliesse ich mich den Fragen meiner beiden Vorredner an.
Mr.Mister
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2013, 09:56

Soo, hatte heute endlich Zeit eure Beiträge zu lesen.
Also:
@BlackJack: Sorry mein Fehler, es war numpy.delete(col,1), dann sollte das ganze auch passen.

Dann @Sirius3 und snafu:
Ich versuche mich für die Uni am UPGMA Clustering zur Erstellung einer Struktur für einen Phylogenetischen Baum.
Ich benutze numpy um mir das Leben mit den Matrixberechnungen einfacher zu machen.
Die Buchstaben sind eigentlich nur Label. Meine idee war es ein "Frame" zu erstellen in das ich nachher die kleiner werdende Matrix und die Labels einfügen kann.

Quasie so:

Code: Alles auswählen

	
        init_Matrix = num.matrix([[0,8,5,3],[0,0,9,2],[0,0,0,3],[0,0,0,0]])
	
	col = num.array(["A","B","C","D"])
	row = num.array(["A","B","C","D"])
	
	matrix_row = 5
	matrix_col = 5
	matrix_Frame = num.zeros((matrix_row, matrix_col), object)
	
	matrix_Frame[1:,1:] = init_Matrix
	matrix_Frame[0,1:] = col
	matrix_Frame[1:,0] = row
	matrix_Frame[0,0] = ''
Wenn die Matrix nun beim clustern kleiner wird, muss ich nur die einzelnen Komponenten anpassen und neu zusammensetzen.

Falls ich mir das Leben zu kompliziert mache und es einfacher geht, ich bin für alles offen.
Es handelt sich hierbei um mein erstes größeres Programm in Python jedoch wollte ich die Chance des Projektes nutzen um meine Fähigkeiten zu erweitern. Falls meine Idee also total daneben ist dürft ihr das gerne sagen :D
BlackJack

@Mr.Mister: Was genau soll denn mit diesem `matrix_Frame` gemacht werden? Das ist ja ein Array mit allgemeinen Objekten, also gehen schon mal sämtliche Vorteile bezüglich der Rechengeschwindigkeit und der kompakten Speicherung von Zahlen in Numpy-Arrays verloren.
Mr.Mister
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2013, 09:56

Naja das Frame dient eig. nur als Hülle zum es mit den Labels und der Zahlenmatrix zu füllen.
Also die oberste Reihe und linkeste Spalte wird mit den Labels gefüllt und der Rest mit einer Matrix aus Zahlenwerten.
Ist es dann sinnvoller sich einfach ein normales 2D Array als Hülle zu definieren statt numpy zu nutzen?

Achja und Danke schonmal für eure Anstrengungen :)
BlackJack

@Mr.Mister: Die Frage ist IMHO immer noch nicht ausreichend beantwortet. Was willst Du damit *machen*, *warum* steckst Du das in so eine „Hülle”? Und was ist ein „normales 2D Array” wenn man kein Numpy benutzt? Python hat keinen eingebauten Arraytyp, nur ein sehr selten genutzes `array`-Modul, welches einen Typ bietet, der so etwas was Du da mit `matrix_Frame` machst, überhaupt nicht zulässt weil es a) nur eindimensionale Arrays gibt und b) da keine allgemeinen Objekte drin gespeichert werden können.

Als 2D-Struktur in ”reinem” Python würde man verschachtelte Listen verwenden. Aber auch da würde sich dann wieder die Frage stellen wozu das überhaupt gut sein soll. Wenn man anfängt Werte mit verschiedenen (Duck-)Typen in eine Liste zu stecken, riecht da irgendwas. Listen sollten möglichst gleichmässig verarbeitbar sein, also zum Beispiel so bestückt sein, dass man auf jedem Element die gleiche Operation ausführen kann. Wenn man Werte mit verschiedenen Typen in eine Liste steckt oder die bedeutung eines Werts von der Position innerhalb der Liste abhängig ist, wird der Code mit dem man das verarbeitet komplizierter und unübersichtlicher weil man Sonderbehandlung nach Typ und/oder Position einbauen muss.
Mr.Mister
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2013, 09:56

Das Python keinen Arraytypen besitzt wusste ich gar nicht.
Ich nutze die Hülle eigentlich nur um nachher eine vernünftige Ausgabe printen zu können.
Also ich rechne ausschließlich mit der Matrix die oben als init_Matrix benannt ist und col und row werden gleich zur Rechnung in iniin Mat_Matrix geclustert. Dann wird das ganze in matrix_Frame zusammengesteckt um eine Ausgabe zu printen und am Ende wird das Clusterergebnis aus row an eine neue Methode übergeben.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mr.Mister hat geschrieben:Das Python keinen Arraytypen besitzt wusste ich gar nicht.
Die Standard Library bietet schon ein array an.
BlackJack

@Mr.Mister: Wenn Du ein Numpy-Array zur Textausgabe ”missbrauchen” möchtest, dann kannst Du das natürlich so machen. Die Absicht wäre von vornherein deutlicher gewesen wenn Du statt ”frei stehendem” Code eine entsprechende Funktion gezeigt hättest, für genau diese Aufgabe.

@/me: Das Modul hatte ich ja schon erwähnt. Was ich auch dauernd vergesse ist der eingebaute `bytearray`-Typ, aber der ist ja hier auch nicht zu gebrauchen. :-)
Mr.Mister
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2013, 09:56

Da bin ich wieder, sorry wegen dem frei stehendem Code, war wirklich etwas dümmlich von mir :D
Ich hab einfach mal just for fun meine col und row Arrays in einfache Listen geändert, aber habe immer noch das Problem, dass mein "AC" zu "A" wird, weil es abgeschnitten wird.
Ich verstehe nicht warum das Element "AC" nicht normal in die Liste eingefügt wird... :(
Mr.Mister
User
Beiträge: 6
Registriert: Freitag 13. Dezember 2013, 09:56

Ok, ich bin ein Depp. :roll:
Wenn ich natürlich meine Änderungen nicht vollständig vornehme, dann brauch ich mich nicht wundern.
Funktioniert also gerade alles wie es soll. Vielen Dank für eure Hilfe :)
Antworten