Я обнаружил, что np.frompyfunc
- лучший инструмент для создания массивов пользовательских классов. Использование np.vectorize
также работает, так как вы указываете otypes
, но frompyfunc
уже возвращает объекты и является немного более прямым и быстрым.
In [667]: class Site:
...: def __init__(self, label, status):
...: self.l = label
...: self.s = status
...: def __repr__(self): # to improve display
...: return f'Site({self.l},{self.s})'
...:
In [668]: f = np.frompyfunc(Site, 2,1)
In [669]: f(np.zeros((2,3),int), np.ones((2,3),int)*2)
Out[669]:
array([[Site(0,2), Site(0,2), Site(0,2)],
[Site(0,2), Site(0,2), Site(0,2)]], dtype=object)
In [670]: f(np.arange(3),np.array(['a','b','c']))
Out[670]: array([Site(0,a), Site(1,b), Site(2,c)], dtype=object)
Я должен предупредить вас, что для доступа к этим Site
объектам также потребуется использование frompyfunc
. Массивы объектов не в полной мере используют вычислительную скорость numpy
. numpy
вычисления работают быстрее всего при работе с числами, а не с объектами.