2017-02-03 4 views
0

Скажем, у меня есть массив полный со многими экземплярами классаNumPy найти среднее из экземпляров класса (перебирать элементы экземпляров)

a = np.array([[A(2, 10)], [A(3, 15)], [A(4, 14)]]) 

Как я могу вычислить, используя NumPy среднее из первых A только индексов.

Следовательно, среднее значение 2, 3, 4?

Один из способов:

thenew = np.zeros((a.size, a.size)) 
for idx, x in np.ndenumerate(a): 
    thenew[idx] = a[idx].a 

result = np.average(thenew[:,0]) 

, но я ищу лучшее решение с использованием NumPy.

Полный код:

import numpy as np 

class A(): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 


class B(): 

    def __init__(self, c, d, the_a): 
     self.c = c 
     self.d = d 
     self.the_a = the_a 

    def method(self, the_a): 
     thenew = np.zeros((self.the_a.size, self.the_a.size)) 
     for idx, x in np.ndenumerate(self.the_a): 
      thenew[idx] = self.the_a[idx].a 

     return np.average(thenew[:,0]) 

a = np.array([[ A(2, 4)], [A(3,5)], [A(4,4)]]) 
b = B(1,1,a) 
print(b.method(a)) 

ответ

1

Создайте список из всех атрибутов a и и их среднее значение:

>>> np.average([x[0].a for x in a]) 
3.0 

Учет списка быстрее, чем np.vectorize для этого случая использования:

%timeit np.average([x[0].a for x in a]) 
100000 loops, best of 3: 12 µs per loop 

против

%%timeit 
func = np.vectorize(lambda x: x.a) 
np.average(func(a)) 
10000 loops, best of 3: 26.2 µs per loop 
+0

Nice, спасибо, я просто хочу спросить, кстати, как индексирование работает в этом case.I имею в виду, 'х [0] .a' дает нам первые элементы, ok.Would мы когда-либо использовать 'x [1] .a'? (upvoted) – George

+0

Нет, вам нужно' x [0] ', потому что ваши экземпляры находятся в' [] ', т.е. '[A (2, 10)]'. Используйте 'np.average ([x [0] .b для x в a])' для второго элемента. Если вы не добавили несколько экземпляров в под-список (второе измерение): '[A (2, 10), A (3, 15)]'. –

+0

О, да. Я бы использовал 'x [1]', если бы я [A (2,10), A (3,4)] ' – George

0

Я хотел бы использовать аналог Numpy от функции питона карты: numpy.vectorize

func = np.vectorize(lambda x: x.a) 
    np.average(func(a)) 
Смежные вопросы