2016-07-23 2 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]) 

Итак, мой вопрос существует ли более лаконичный и вещий способ сделать это?

Заранее благодарен!

ответ

1

Эта итерация является «питонической».

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 возвращает функцию, которая применяет вход f к элементам a,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__.

Смежные вопросы