2013-03-16 58 views
3

這可能是一個愚蠢的問題,而是說我想建立一個程序,從下往上,像這樣:NumPy的:類實例的數組

class Atom(object): 
    def __init__(self): 
     ''' 
     Constructor 
     ''' 
    def atom(self, foo, bar): 
     #...with foo and bar being arrays of atom Params of lengths m & n 
     "Do what atoms do" 
     return atom_out 

...我可以把我的情況下,在詞典:

class Molecule(Atom): 
    def __init__(self): 


    def structure(self, a, b): 
     #a = 2D array of size (num_of_atoms, m); 'foo' Params for each atom 
     #b = 2D array of size (num_of_atoms, n); 'bar' Params for each atom 

     unit = self.atom() 
     fake_array = {"atom1": unit(a[0], b[0]), 
         "atom2": unit(a[1], b[1]), 
         :      :     : 
         :      :     :} 

    def chemicalBonds(self, this, that, theother): 
     :       :      : 
     :       :      : 

我的問題是,有沒有辦法用numpy的陣列來做到這一點,這樣在「real_array」每個元素將​​--ie,​​功能的個人計算的輸出的實例?我可以擴展到class Water(molecule):這將在大型structurechemicalBonds輸出上執行快速numpy操作,因此需要陣列......或者是我遇到這種錯誤的方式?

另外,如果我在正確的軌道上,我會很感激,如果你想拋出任何提示如何構建這樣的「分層程序」,因爲我不知道我是否正確地做了上述最近發現我不知道我在做什麼。

在此先感謝。

+1

「最近發現,我不知道我在做什麼」。我想知道它的感覺。聽起來像是一個真正的啓蒙時刻;) – shx2 2013-03-16 20:27:17

+2

'self.unit = self.atom()' - 你不是在函數調用中缺少參數嗎?什麼是'real_array'? 'a,b,x,y,foo,bar'中的元素是什麼類型? – shx2 2013-03-16 20:32:11

+0

@ shx2這是一次旅行。由於你可以說「我今天學到了東西」,因此壓得很低。 – 2013-03-16 20:46:31

回答

5

地獄之路鋪滿了過早的優化......作爲python的初學者,專注於你的程序和應該做的事情,一旦它做得太慢,你可以詢問關於如何做的關鍵問題做得更快。我會堅持學習Python的內在數據結構來管理你的對象。如果您正在執行大型數組操作,則可以使用具有標準數據類型的numpy數組來實現算法。一旦你有一些工作代碼,你可以做性能測試,以確定你需要優化的地方。

Numpy確實可以讓你創建對象的數組,而且我會給你足夠的繩子來讓自己掛在下面,但是創建一個工具生態系統來操作這些對象數組並不是一件小事。您應該首先使用Python數據結構(購買Beazley的必備python參考),然後使用numpy的內置類型,然後創建自己的compound numpy types。作爲最後的手段,使用下例中的對象類型。

祝你好運!

大衛

import numpy 

class Atom(object): 
    def atoms_method(self, foo, bar): 
     #...with foo and bar being arrays of Paramsof length m & n 
     atom_out = foo + bar 
     return atom_out 


array = numpy.ndarray((10,),dtype=numpy.object) 

for i in xrange(10): 
    array[i] = Atom() 

for i in xrange(10): 
    print array[i].atoms_method(i, 5)