Numpyarray to string funktioniert nicht

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hi,

kann sein, dass das eine "dumme" Frage ist, aber ich habe versucht von einem Objektattribut den Inhalt von einem numpy.int32 typ zu einem String zu machen.

Code: Alles auswählen

clf = DecisionTreeClassifier(max_depth=5)

print(type(clf.classes_))
print(type(clf.classes_[0]))

map(str, clf.classes_)

print(type(clf.classes_[0]))

Output:

Code: Alles auswählen

<class 'numpy.ndarray'>
<class 'numpy.int32'>
<class 'numpy.int32'>

nachdem ich den Inhalt von clf.classes_ in einer separaten Variable gespeichert habe, hat es funktioniert.

Verstehe nur nicht warum :)

Liebe Grüße und danke.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Deine `map()`-Zeile macht halt nix. Da wird ein Iterator erstellt der die `str()`-Funktion auf die Elemente von `clf.classes_` anwenden *würde*, wenn man sie denn abfragen würde, beispielsweise durch Iteration. Aber das Iteratorobjekt wird dann einfach verworfen, weil damit nix gemacht wird.

Und wenn man über das Objekt iteriert, dann verändert das auch nichts an `clf.classes_` oder dessen Elementen weil `str()` das Argument ja nicht verändert, sondern eine Zeichenkette als Ergebnis liefert.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

__blackjack__ hat geschrieben: Mittwoch 10. Juni 2020, 14:41 @naheliegend: Deine `map()`-Zeile macht halt nix. Da wird ein Iterator erstellt der die `str()`-Funktion auf die Elemente von `clf.classes_` anwenden *würde*, wenn man sie denn abfragen würde, beispielsweise durch Iteration. Aber das Iteratorobjekt wird dann einfach verworfen, weil damit nix gemacht wird.

Und wenn man über das Objekt iteriert, dann verändert das auch nichts an `clf.classes_` oder dessen Elementen weil `str()` das Argument ja nicht verändert, sondern eine Zeichenkette als Ergebnis liefert.
Danke. Das habe ich ja dann auch irgendwie gemerkt. Aber mal angenommen, man würde da wirklich den Datentyp ändern wollen. How does it work?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
__blackjack__
User
Beiträge: 13926
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: So wirklich gar nicht. Man kann ein neues Array erstellen das Elemente vom Typ `object` aufnehmen kann und das mit den umgewandelten Werten füllen. Aber solche Arrays machen in der Regel wenig Sinn, da würde man eine Liste für nehmen. Also beispielsweise noch ein `list()`-Aufruf auf den Iterator, damit der abgearbeitet wird und die Ergebnisse in einer Liste landen. Und dann muss man das Ergebnis noch an einen Namen binden oder anderweitig verwenden.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Ein Numpy-Array kannst du mit der astype-Methode casten.

Code: Alles auswählen

import numpy as np
arr = np.random.sample((5, 5))
print(arr)
print(arr.astype(str))
Den Datentyp eines Klassenarributes zu ändern scheint mir eher unglücklich, denn ich gehe davon aus, dass dort aus gutem Grund ein bestimmte Typ verwendet wurde. Ich kenne deine Klasse nicht, aber das sähe dann so aus:

Code: Alles auswählen

clf.classes_ = clf.classes_.astype(str)
Sirius3
User
Beiträge: 18219
Registriert: Sonntag 21. Oktober 2012, 17:20

Und benutzt keine Abkürzungen, wenn `classifier` gemeint ist, dann sollte man die Variable nicht `clf` nennen.
Antworten