Angenommen, ich habe folgendes numpy Array:Delegieren Anrufe zu einer Methode numpy Arrays auf dessen Elemente
arr = np.array(["a", "b", "c"], dtype=object)
Jetzt möchte ich eine beliebige Funktion auszuführen, oder eine beliebige Methode aufrufen, auf jedem Element. Angenommen, ich möchte alle diese Elemente in Großbuchstaben setzen. „Logisch“ zu sprechen, würde Ich mag so etwas tun:
upp_arr = arr.upper()
oder
upp_arr = str.upper(arr)
Kurzversion: kann ich entweder die oben erreichen?
Lange Version: Das wird natürlich nicht arbeiten, um das Array unter Berücksichtigung nicht über eine upper
Methode (auch wenn die einzelnen Elemente zu tun), noch die str
Einbau-weiß, wie ein numpy Array zu behandeln. Ich möchte keine benutzerdefinierte Version von str.upper
erstellen, die mit Arrays umgehen kann, da ich im Voraus wissen muss, welche Funktionen der Benutzer meines Arrays verwenden möchte.
Ich könnte so etwas wie
upp_arr = np.array([x.upper() for x in arr])
Ich mag das nicht tun, aber: jetzt muss ich an die Nutzer meines Codes belichten, dass arr
tatsächlich ein numpy Array ist. Ich möchte etwas wie die oben genannten zwei nicht funktionierenden Lösungen bekommen.
ich versuchte, diese durch Nebenklassen np.ndarray
und Überschreiben des __getattr__(self, name)
Methode ein Array der Elemente -Attribut des Namens name
geschehen zu lassen, wenn kein Attribut name
von np.ndarray
ist, und dessen __call__
Methode überschreiben, um ein Array der Elemente Aufruf `Ergebnis:
import numpy as np
class MyArr(np.ndarray):
def __getattr__(self, name):
if hasattr(np.ndarray, name):
return getattr(np.ndarray, name)
arr = MyArr(self.shape, dtype=object)
arr[:] = [getattr(elem, name) for elem in self]
return arr
def __call__(self):
arr = MyArr(self.shape, dtype=self.dtype)
arr[:] = [elem() for elem in self]
return arr
arr = MyArr((3,), dtype=object)
arr[:] = ["a", "b", "c"]
arr.upper()
Dies hat zwei Probleme: die Array-Konstruktion ist ein Schmerz im Hintern (haben es instanziiert zuerst, und füllen sie ihn dann mit Werten) und Ich muss davon ausgehen, dass das Ergebnis o f Der Funktionsaufruf hat denselben D-Typ wie das ursprüngliche Array (dtype=self.dtype
). Letzteres ist kein Problem, wenn ich bei object
Typ Arrays bleiben, aber im Allgemeinen werden.
Wie lösen?
Ich sehe das Problem mit Konstrukt und Füllung nicht. 'numpy' macht das die ganze Zeit. 'vectorize' wertet einen Wert aus und verwendet sein Ergebnis, um den Rückgabe-dtype festzulegen. Gelegentlich ergeben sich SO-Fragen. – hpaulj