Пользовательские типы данных в массивах NumPy - PullRequest
23 голосов
/ 28 февраля 2010

Я создаю пустой массив, который должен быть заполнен объектами определенного класса, который я создал. Я хотел бы инициализировать массив так, чтобы он когда-либо содержал только объекты этого класса. Например, вот что я хотел бы сделать, и что произойдет, если я это сделаю.

class Kernel:
    pass

>>> L = np.empty(4,dtype=Kernel)

TypeError: data type not understood

Я могу сделать это:

>>> L = np.empty(4,dtype=object)

, а затем присваивайте каждому элементу L объект Kernel (или объект любого другого типа). Было бы так здорово, если бы я мог иметь массив Kernel с, как с точки зрения программирования (проверка типов), так и с математической (операции над наборами функций).

Можно ли мне как-то указать тип данных массива с использованием произвольного класса?

Ответы [ 3 ]

22 голосов
/ 01 марта 2010

Если ваш класс Kernel имеет предсказуемый объем данных-членов, вы можете определить для него dtype вместо класса. например если он параметризован 9 числами с плавающей запятой и целым числом, вы можете сделать

kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)])
arr = np.empty(dims, dtype=kerneldt)

Вам нужно будет сделать какое-то принуждение, чтобы превратить их в объекты класса Kernel каждый раз, когда вы захотите манипулировать методами одного ядра, но это один из способов сохранить фактические данные в массиве NumPy. Если вы хотите сохранить только ссылку, то объект dtype - это лучшее, что вы можете сделать без подкласса ndarray.

3 голосов
/ 28 февраля 2010
1 голос
/ 28 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...