Diese Iteration ist "Pythonic".
numpy
hat eine Funktion, die in diesem Fall funktioniert, und möglicherweise ein bisschen schneller. Es ist nicht magisch:
In [142]: a=np.linspace(0,100,10)
In [143]: b=np.linspace(0,50,10) # change to match a size
In [144]: f=np.frompyfunc(test,2,1)
In [145]: c=f(a,b)
In [146]: c
Out[146]:
array([<__main__.test object at 0xb21df12c>,
<__main__.test object at 0xb21dfb2c>,
<__main__.test object at 0xb221a9cc>,
<__main__.test object at 0xb222c44c>,
<__main__.test object at 0xb2213d0c>,
<__main__.test object at 0xb26bc16c>,
<__main__.test object at 0xb2215c0c>,
<__main__.test object at 0xb221598c>,
<__main__.test object at 0xb21eb2cc>,
<__main__.test object at 0xb21ebc6c>], dtype=object)
In [147]: c[0].x,c[1].y
Out[147]: (0.0, 5.555555555555555)
frompyfunc
eine Funktion gibt, die die Eingabe f
auf Elemente a,b
gilt. Ich definiere es so, als würde ich 2 Eingänge nehmen und 1 Array zurückgeben. Standardmäßig gibt es ein Objektarray zurück, das zu Ihrem Fall passt.
np.vectorize
verwendet die gleiche Funktion, aber mit einigen Overhead, die die Verwendung erleichtern können.
Es behandelt auch Rundfunk, so durch einen Eingang in eine Spaltenanordnung ändert ich eine 2d Ausgabe:
In [148]: c=f(a,b[:,None])
In [149]: c.shape
Out[149]: (10, 10)
Aber bedenken Sie, dass es nicht viel, dass Sie mit diesem c
tun können. Es ist wenig mehr eine Liste von test
Instanzen. Zum Beispiel funktioniert c+1
nicht, es sei denn, Sie definieren eine __add__
Methode.