2013-09-02 3 views
4

У меня есть многомерный массив объектов, что-то вроде:Numpy массив атрибутов объекта

a = np.array([obj1,obj2,obj3]) 

объекты являются экземплярами класса, который имеет несколько атрибутов. Скажем, одна из них - это высоты, а одна из них - длина. Для того, чтобы получить соответствующий многомерный массив длины и высоты, что я делаю:

lengths = np.array([obj1.length,obj2.length,obj3.length]) 

heights = np.array([obj1.height,obj2.height,obj3.height]) 

Это начинает засорять мой код довольно много. Есть ли более эффективный способ сделать это? Например, у меня было что-то вроде

heights = a.height 

в виду, но, очевидно, она не работает, потому что это массив из моих объектов и не мой объект. Но есть ли что-то подобное, что я могу сделать, это эффективно и питонично? Я пытался что-то вроде

for x in np.nditer(a,flags=['refs_ok']): 
    print x.length 

, чтобы посмотреть, что будет происходить, но это не работает, потому что nditer возвращает кортеж каким-то образом.

Любые идеи?

+0

Можете ли вы предоставить немного больше кода _exactly_, что вы делаете? Включите класс _minimal_, чтобы воспроизвести эту и обратную трассировку из полученной вами ошибки. – tacaswell

+0

, и вы прочитали это: http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#arrays-nditer – tacaswell

ответ

1

Вы можете vectorize функцию:

>>> import numpy 
>>> 
>>> class Obj(object): 
...  def __init__(self, x, y): 
...   self.x = x 
...   self.y = y 
... 
>>> arr = numpy.array([Obj(1, 2), Obj(3, 4), Obj(5, 6)]) 
>>> 
>>> vectorized_x = numpy.vectorize(lambda obj: obj.x) 
>>> 
>>> vectorized_x(arr) 
array([1, 3, 5]) 

Хотя я не уверен, что если вы действительно должны хранить массив NumPy объектов Python в первую очередь. Vectorize не более эффективен, чем цикл Python. Было бы более удобно хранить массив (n + 1) -D, так как мы могли бы легко извлечь содержимое просто путем нарезки, которая является нативной операцией, например.

>>> a = numpy.array([[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10), (11, 12)], [(-13, -14), (-15, -16), (-17, -18)]]) 
>>> a[:,:,0] 
array([[ 1, 3, 5], 
     [ 7, 9, 11], 
     [-13, -15, -17]]) 
>>> a[:,:,1] 
array([[ 2, 4, 6], 
     [ 8, 10, 12], 
     [-14, -16, -18]]) 
Смежные вопросы