2016-04-12 8 views
0

Ich habe ein ndarray A, das Objekte des gleichen Typs, insbesondere verschiedene LinearNDInterpolator Objekte speichert. Nehmen wir zum Beispiel an, es ist nur 2:Mehrere Elemente von numpy Objekt-Array auswerten

>>> A 
array([ <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe122adc750>, 
     <scipy.interpolate.interpnd.LinearNDInterpolator object at 0x7fe11daee590>], dtype=object) 

Ich möchte in der Lage sein, zwei Dinge zu tun. Zunächst möchte ich alle Objekte in A an einem bestimmten Punkt bewerten und ein Array von A.Shape mit allen darin enthaltenen Werten zurückgeben. So etwas wie

>> A[[0,1]](1,1) = 
array([ 1, 2]) 

Allerdings bekomme ich

TypeError: 'numpy.ndarray' object is not callable 

Ist es möglich, das zu tun?

Zweitens möchte ich die Interpolationswerte ändern, ohne neue LinearNDInterpolator Objekte zu konstruieren (da die Knoten gleich bleiben). Das heißt, so etwas wie

A[[0,1]].values = B 

wo B ein ndarray die neuen Werte für jedes Element von A.

für Ihre Anregungen Danke enthalten ist.

Antwort

1

Das gleiche Problem, aber mit einfacheren Funktionen:

In [221]: A=np.array([add,multiply]) 

In [222]: A[0](1,2) # individual elements can be called 
Out[222]: 3 

In [223]: A(1,2) # but not the array as a whole 
---------------------------------------------------------------------------  
TypeError: 'numpy.ndarray' object is not callable 

Wir können eine Liste von Funktionen durchlaufen, oder das Array als auch, um jedes Element zu den Parametern aufrufen. Fertig gemacht können wir sogar eine Liste von Funktionen und eine Liste von Parametern zippen.

In [224]: ll=[add,multiply] 

In [225]: [x(1,2) for x in ll] 
Out[225]: [3, 2] 

In [226]: [x(1,2) for x in A] 
Out[226]: [3, 2] 

Ein weiterer Test, der callable Funktion:

In [229]: callable(A) 
Out[229]: False 

In [230]: callable(A[0]) 
Out[230]: True 

Können Sie die Interpolation Werte für einzelne Interpolatoren ändern? Wenn ja, iteriere einfach die Liste und tue das.

Im Allgemeinen funktionieren dtype-Objektarrays wie Listen. Sie enthalten die gleiche Art von Objektzeigern. Die meisten Operationen erfordern die gleiche Art von Iteration. Wenn Sie die Elemente nicht in mehreren Dimensionen organisieren müssen, haben dtype-Objektarrays wenige Vorteile gegenüber Listen.

Ein anderer Gedanke - der normale Array dtype ist numerische oder feste Länge Zeichenfolgen. Diese Elemente sind nicht aufrufbar, daher muss für diese Arrays keine .__call__-Methode implementiert werden. Sie könnten so etwas schreiben, um auf Objekt-Dtyp-Arrays zu operieren, aber die Kernaktion ist ein Python-Aufruf. Eine solche Funktion würde also nur die Art von Iteration verbergen, die ich skizziert habe.

In einer anderen letzten Frage habe ich gezeigt, wie man np.char.upper verwendet, um eine String-Methode auf jedes Element eines S dtype-Arrays anzuwenden. Aber meine Zeittests haben gezeigt, dass dies nichts beschleunigt hat.

+0

Hey, danke für deine Antwort. Das Problem ist, dass das Array n-dimensional ist, so dass es mühsam wäre, mit Listen oder Schleifen zu arbeiten. Mit numpy.frompyfunc gelang es mir, das erste zu tun: Ich kann eval_element = lambda array: array (1,1) definieren und dann eval_ufunc = np.frompyfunc (eval_element, 1, 1) definieren. eval_ufunc (A) gibt dann ein ndarray von jedem LinearND-Interpolator zurück, der bei (1,1) evaluiert wurde. – Tobias

+0

Und ja, Sie können die Werte der Interpolatoren ändern, sie sind im Attribut A [0] .values ​​gespeichert. – Tobias

+0

'frompyfunc' wird unter geschätzt.Ich habe es in ein paar SO Antworten verwendet, z. http://stackoverflow.com/a/36297194/901925 – hpaulj