Я создаю массив numpy, который должен быть заполнен объектами конкретного класса, который я сделал. Я хотел бы инициализировать массив, таким образом, что он будет только когда-либо содержать объекты того класса. Например, вот то, что я хотел бы сделать, и что происходит, если я делаю это.
class Kernel:
pass
>>> L = np.empty(4,dtype=Kernel)
TypeError: data type not understood
Я могу сделать это:
>>> L = np.empty(4,dtype=object)
и затем присвойте каждый элемент L
как a Kernel
объект (или любой другой тип объекта). Это было бы, таким образом аккуратный был я способный иметь массив Kernel
s, тем не менее, от обоих точка зрения программирования (вводят проверку), и математический (операции на наборах функций).
Есть ли какой-либо способ для меня определить тип данных массива numpy с помощью произвольного класса?
Если ваш класс 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.
Насколько мне известно, принудительное применение единственного типа для элементов в numpy.ndarray должно выполняться вручную (если массив не содержит скаляров Numpy): нет встроенного механизма проверки (в вашем массиве есть dtype = object) . Если вы действительно хотите применить один тип, вы должны создать подкласс ndarray и реализовать проверки соответствующими методами ( __ setitem __
и т. Д.).
Если вы хотите реализовать операции с набором функций (объектами ядра), вы можете сделать это, определив соответствующие операции непосредственно в своем классе ядра. Это то, что я сделал для своего модуля неопределенности.py , который обрабатывает множество чисел с неопределенностями.
Это должен быть скалярный тип 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