/ / Python: Pridanie funkcie do poľa v slučke FOR - python, polia, funkcia, metaprogramovanie

Python: Pridať funkciu do poľa v slučke FOR - python, pole, funkcia, metaprogramovanie

Možno je to jednoduchý problém, ale doteraz som o tom nemohol nájsť žiadne informácie. Pre optimalizáciu v systéme Windows 7 numpy Potrebujem celý rad funkcií. Počet funkcií, ktoré potrebujem, závisí od aktuálneho objektu, ktorý sa má optimalizovať. Už som prišiel na to, ako vytvoriť tieto funkcie dynamicky, ale teraz by som ich chcel uložiť do súboru, ako je tento:

myArray = zeros(x)
for i in range(x):
myArray[i] = createFunction(i)

Ak spustím toto, dostanem nesúlad typu: argument float () musí byť reťazec alebo číslo, nie „funkcia“

Vytvorenie poľa priamo funguje dobre:

  myArray = array([createFunction(0)...])

Ale pretože neviem, koľko funkcií potrebujem, je tomu presne tomu, čomu chcem zabrániť.

odpovede:

2 pre odpoveď č. 1

Ah, chápem to. Naozaj máte na mysli celý rad funkcie.

Chyba nesúladu typu vzniká z dôvodu volania na zeros v predvolenom nastavení vytvára rad plavákov. Takže originál by fungoval, ak by ste to urobili myArray = numpy.empty(x, dtype=numpy.object) (poznač si to empty dáva väčší zmysel ako zeros tu). Trochu pythonickejšia verzia je použitie porozumenia zoznamu

myArray = numpy.array([createFunction(i) for i in range(x)]).

Možno však nebudete musieť vôbec vytvoriť početné pole, v závislosti od toho, čo s ním chcete urobiť:

myArray = [createFunction(i) for i in range(x)]

Ak sa chcete vyhnúť zoznamu, mohlo by byť lepšie použiť numpy.fromfunction spolu s numpy.vectorize:

myArray = numpy.fromfunction(numpy.vectorize(createFunction),
shape=(x,), dtype=numpy.object)

kde (x,) je n-tica udávajúca tvar poľa. Výzva na vectorize je potrebné, pretože fromfunction predpokladá, že funkcia môže pracovať na poli vstupov a vrátiť pole skalárov, a vectorize prevedie funkciu, aby to urobila presne. The dtype=object je potrebný, pretože inak sa numpy pokúsi vytvoriť pole plavákov.


1 pre odpoveď č. 2

Možno môžete použiť

myArray = array([createFunction(i) for i in range(x)])

1 pre odpoveď č. 3

Ak potrebujete množstvo funkcií, je to možné nie používať NumPy? Polia NumPy majú typy v štýle C a predvolene je float. Ak môžete, použite štandardný zoznam Pythonu. Ak však musíte bezpodmienečne použiť NumPy, skúste definovať pole takto:

import numpy as np
a = np.empty([x], dtype=np.dtype(np.object_))

Alebo akokoľvek to potrebujete že dtype.


1 pre odpoveď č. 4

Početné polia sú homogénne.To znamená, že všetky prvky poľa numpy sú rovnakého typu - krajta python, numpy nie je t. Toto je súčasť toho, čo robí operácie matíc na poliach numpy a maticiach tak rýchle. Z tohto dôvodu je to však dátový typ. musí byť známe pri prvom vytvorení poľa. Numpy je všeobecne veľmi dobrý pri odvodzovaní dátového typu. Problém nastáva pri vytváraní prázdneho alebo vynulovaného poľa. Pretože neexistujú žiadne prvky na preskúmanie, numpy musí uhádnuť dátový typ. Numpy je predvolene numpy .float64, ak nie je daný dátový typ v čase vytvárania poľa. Toto je slušná voľba, pretože numpy sa zvyčajne používa vo vedeckých alebo technických oblastiach, kde sa vyžadujú čísla s pohyblivou rádovou čiarkou. Aj preto sa NumPy sťažuje - pretože nemôže ukladať vaše funkcie ako 64-bitové čísla s pohyblivou rádovou čiarkou.

Rýchlym riešením je dať spoločnosti NumPy vedieť požadovaný dátový typ. napr.

myArray = numpy.zeros(x, dtype=numpy.object)

Upozorňujeme, že dátovým typom nemôže byť žiadna trieda, alemusí byť inštanciou numpy.dtype (pre pokročilé použitie môžete vytvoriť ďalšie dtypy za behu, s ktorými potom môže numpy manipulovať). Pre funkcie ich bude numpy ukladať ako numpy.object (čo znamená akýkoľvek všeobecný objekt pythonu). Nemyslím si, že z používania programu numpy na ukladanie polí funkcií získate výkonnostné výhody. Možno by vám bolo lepšie vytvárať funkcie generátora a reťaziť ich a prevádzať na početné pole, keď viete, že výsledkom bude číslo.

funcs = [createFunction(i) for i in xrange(x)]

def getItemFromEachFunction(i):
return funcs[i]()

arr = numpy.fromfunction(getItemFromEachFunction, (x,))