Эта итерация является «питонической».
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__
.