Portál AbcLinuxu, 12. května 2025 06:07

Dotaz: Python - jak vektorizovat metodu ve třídě?

24.7.2014 22:43 Olaf
Python - jak vektorizovat metodu ve třídě?
Přečteno: 463×
Odpovědět | Admin
Zdarec, z nadpisu dotazu je to zřejmé: mám jistou třídu, třída má funkci, tedy teď už metodu, která musí pracovat s vektory. Na převod své metody (funkce) používám z Numpy tradiční np.vectorize(fce), kde fce je ona metoda. Ve třídě to ale nejde dobře: když dám fce = classmethod(np.vectorize(fce)), tak Python pak řve, že třída neobsahuje použité atributy (přitom tam jsou). Pokud takto metodu nezvektorizuju, tak to jede OK a atributy jsou přístupné. Jinými slovy, vektorizovat metodu přes numpy vectorize nejde? Jestli ne, tak to prostě proženu samostatným cyklem, no.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.7.2014 02:29 chrono
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nefunguje to ani ako dekorátor?

a teda niečo ako:
@np.vectorize
def fce(self, ...):
    pass
25.7.2014 03:32 Olaf
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
E-e, tohle vůbec nevezme. Hází chybu hned.
25.7.2014 10:26 petr b
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Proč classmethod? numpy.vectorize nejde na normálních metodách, ale bude fungovat na staticmethod.
import numpy as np

class VC(object):
    @staticmethod
    @np.vectorize
    def myfunc(a, b):
        "Return a-b if a>b, otherwise return a+b"
        if a > b:
            return a - b
        else:
            return a + b


print VC.myfunc([1, 2, 3, 4], 2)

o = VC()
print o.myfunc([1, 2, 3, 4], 2)
Ale pak proč to mít ve třídě?
26.7.2014 04:44 Olaf
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Na ja, aber... Ta metoda musí fungovat s atributy z třídy. Prostě jsem to a) prohnal loopem, b) nakonec hodil ven jako samostatnou funkci.
25.7.2014 14:20 Sten
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Odpovědět | | Sbalit | Link | Blokovat | Admin
První parametr je self, ale Numpy se jej pokusí vektorizovat. Zkusil bych:
fce = np.vectorize(fce, excluded=['self'])
Navíc classmethod dělá trochu něco jiného, než chcete.
26.7.2014 04:47 Olaf
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Dík, já to zkoušel různě, nic nebylo úspěšně. Jak píšu výše, prostě jsem nakonec tu funkci hodil ven a instanci třídy použil jako parametr. Chtěl jsem to původně mít uspořádáno uvnitř, ale to je vlastně fuk (šlo by to, s vlastním loopem, ale pak by to bylo pomalejší, protože některé výpočty by se dělaly znova a znova). Ještě jednou díky za snahu.
26.7.2014 12:01 logik
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli chceš efektivně vektorizovat, tak se koukni na cython a prange.

Pokud je vektorizace kvůli syntaktickýmu cukru, tak si tu vektorizovanou metodu napiš jako vnitřní funkci classmetody objektu, kterou v tý classmetodě jen nadefinuješ a zavoláš. Sice tam bude o jedno volání fce víc, ale to zpravidla nevadí (pokud ji teda nevoláš stotisíckrát v cyklu).
26.7.2014 12:37 logik
Rozbalit Rozbalit vše Re: Python - jak vektorizovat metodu ve třídě?
Jinak nevím, k čemu přesně používáš to np.vectorize, ale mam zkušenosti, že rychlejší je to napsat čistě jako funkci rovnou příjmající i argumenty typu np.ndarray.

np.vectorize totiž tu tvojí "vektorizovanou" funkci zavolá pro každej prvek pole, zatímco pokud použiješ "vektorovou aritmetiku" - tzn. přímo operátory nad np.ndarray, tak je volána jen jednou a pro výpočet matematických operací se použijou vektorizovaný rutiny z matematickejch knihoven (ATLAS, OpenBlas apod.)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.