Подтвердить что ты не робот

Пользовательские типы данных в массивах 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 с использованием произвольного класса?

4b9b3361

Ответ 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.

Ответ 3

Насколько я знаю, принудительное использование одного типа для элементов в numpy.ndarray должно выполняться вручную (если только массив не содержит скаляры Numpy): нет встроенного механизма проверки (ваш массив имеет dtype = object), Если вы действительно хотите применить один тип, вы должны подклассифицировать ndarray и реализовать проверки в соответствующих методах (__setitem__ и т.д.).

Если вы хотите реализовать операции над набором функций (объекты ядра), вы могли бы это сделать, указав правильные операции непосредственно в своем классе Kernel. Это то, что я сделал для моего неопределенности .py, который обрабатывает numpy.ndarrays чисел с неопределенностями.