Пользовательские типы данных в массивах numpy

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

class Kernel:
    pass

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

TypeError: data type not understood

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

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

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

Есть ли какой-либо способ для меня определить тип данных массива numpy с помощью произвольного класса?

23
задан Mike Dewar 28 February 2010 в 04:21
поделиться

3 ответа

Если ваш класс Kernel имеет предсказуемое количество данных-членов, то вы можете определить для него dtype вместо класса. Например, если он параметризуется 9 float и int, вы можете сделать

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

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

22
ответ дан 29 November 2019 в 02:46
поделиться

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

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

1
ответ дан 29 November 2019 в 02:46
поделиться
3
ответ дан 29 November 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: