2016-07-23 64 views
0

我有幾個包含數據的numpy數組和一個我定義的類,其中的屬性對應於我的numpy數組中的每個數組。我想快速創建另一個包含對象列表的數組,每個對象屬性都由numpy數組的相應元素定義。基本上,下面的等價:使用numpy數組中的數據創建對象列表

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]) 

所以,我的問題是確實存在一個更簡潔和Python的方式做到這一點?

在此先感謝!

回答

1

該迭代是'pythonic'。

numpy確實有一個功能,在這種情況下,可能會更快一點。這不是神奇:

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返回應用於輸入fa,b元素的功能。我將其定義爲獲取2個輸入,並返回1個數組。默認情況下,它會返回一個適合您的情況的對象數組。

np.vectorize使用這個相同的功能,但有一些開銷,可以使它更容易使用。

它還處理廣播,所以通過改變輸入到列數組我得到一個2D輸出:

In [148]: c=f(a,b[:,None]) 
In [149]: c.shape 
Out[149]: (10, 10) 

但是要記住,不是很多,你可以用這個c做。它只是一個test實例的列表。例如c+1不起作用,除非您定義__add__方法。