2013-03-16 4 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» будет экземпляром atom --ie, выход отдельных вычислений atom функции? Я могу расширить это до class Water(molecule):, который будет выполнять быстрые операции с numpy на больших выводах structure и chemicalBonds, следовательно, нужны массивы ... Или это так, что я собираюсь сделать это неправильно?

Также, если я нахожусь на правильном пути, я был бы признателен, если бы вы захотели бросить какие-либо советы о том, как структурировать «иерархическую программу», как это, так как я не уверен, что делаю это правильно и недавно обнаружил, что я не знаю, что делаю.

Заранее спасибо.

+1

«недавно обнаружил, что я не знаю, что я делаю». Интересно, как это чувствует. Звучит как настоящий момент просветления;) – shx2

+2

'self.unit = self.atom()' - разве вам не хватает аргументов в вызове функции? что такое 'real_array'? какие типы являются элементами в 'a, b, x, y, foo, bar'? – shx2

+0

@ shx2 Это поездка. Сокрушительный минимум улучшился благодаря тому, что вы можете сказать: «Сегодня я чему-то научился». –

ответ

5

Путь в ад проложен с преждевременной оптимизацией ... Как новичок в python, сосредоточьтесь на своей программе и на том, что должно делать, как только она делает это слишком медленно, вы можете задать целенаправленные вопросы о том, как это сделать делайте это быстрее. Я бы придерживался изучения встроенных структур данных python для управления вашими объектами. Вы можете реализовать свои алгоритмы, используя массивы numpy со стандартными типами данных, если вы выполняете операции большого массива. После того, как у вас есть рабочий код, вы можете выполнить тестирование производительности, чтобы определить, где вам нужна оптимизация.

Numpy позволяет создавать массивы объектов, и я дам вам достаточно веревки, чтобы повесить себя ниже, но создание экосистемы инструментов для работы с этими массивами объектов - это не тривиальное начинание. Сначала вы должны работать с структурами данных python (купите основную ссылку на питон Beazley), затем с помощью встроенных типов 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) 
Смежные вопросы