Пользовательские типы данных в массивах numpy
Я создаю массив numpy, который должен быть заполнен объектами определенного класса, который я создал. Я хотел бы инициализировать массив таким образом, чтобы он всегда содержал только объекты этого класса. Например, вот что я хотел бы сделать, и что произойдет, если я это сделаю.
class Kernel:
pass
>>> L = np.empty(4,dtype=Kernel)
TypeError: data type not understood
Я могу это сделать:
>>> L = np.empty(4,dtype=object)
а затем назначьте каждый элемент L
как объект Kernel
(или любой другой тип объекта). Это было бы настолько аккуратно, что я мог бы иметь массив Kernel
s, хотя, как с точки зрения программирования (проверка типа), так и с математической (операции над наборами функций).
Есть ли способ указать тип данных массива numpy с использованием произвольного класса?
Ответы
Ответ 1
Если ваш класс Kernel имеет предсказуемое количество данных членов, тогда вы можете определить для него тип dtype вместо класса. например если он параметризуется 9 поплавками и int, вы можете сделать
kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)])
arr = np.empty(dims, dtype=kerneldt)
Вам нужно будет сделать какое-то принуждение, чтобы превращать их в объекты класса Kernel каждый раз, когда вы хотите манипулировать методами одного ядра, но это один из способов хранения фактических данных в массиве NumPy. Если вы хотите сохранить только ссылку, то dtype объекта лучше всего сделать без подкласса ndarray.
Ответ 2
Он должен быть скалярным типом Numpy:
http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html#arrays-scalars-built-in
или подкласс ndarray:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html#numpy.ndarray
Ответ 3
Насколько я знаю, принудительное использование одного типа для элементов в numpy.ndarray должно выполняться вручную (если только массив не содержит скаляры Numpy): нет встроенного механизма проверки (ваш массив имеет dtype = object), Если вы действительно хотите применить один тип, вы должны подклассифицировать ndarray и реализовать проверки в соответствующих методах (__setitem__
и т.д.).
Если вы хотите реализовать операции над набором функций (объекты ядра), вы могли бы это сделать, указав правильные операции непосредственно в своем классе Kernel. Это то, что я сделал для моего неопределенности .py, который обрабатывает numpy.ndarrays чисел с неопределенностями.