2016-07-23 19 views
0

Ich habe mehrere numpy Arrays mit Daten, und eine Klasse I definiert, mit Attributen für jede meiner numpy Arrays. Ich möchte schnell ein anderes Array erstellen, das eine Liste von Objekten enthält, wobei jedes Objektattribut durch das entsprechende Element des numpy-Arrays definiert wird. Grundsätzlich ist die äquivalent die folgenden:Erstellen einer Liste von Objekten mit Daten aus numpy Arrays

class test: 
    def __init__ (self, x, y): 
      self.x = x 
      self.y = y 
a = np.linspace(100) 
b = np.linspace(50) 
c = np.empty(len(a), dtype = object)  
for i in range(len(a)): 
    c[i] = test(a[i], b[i]) 

Also, meine Frage ist, Gibt es einen prägnanten und pythonic Weg, dies zu tun?

Vielen Dank im Voraus!

Antwort

1

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.

Verwandte Themen