Если у меня есть собственный класс python и используйте его в numpy.ndarray
, мой массив заканчивается dtype 'O' (object), что отлично:
import numpy
class Test(object):
"""Dummy class
"""
def __init__(self, value):
self.value = value
def __float__(self):
return float(self.value)
arr = numpy.array([], dtype=Test)
Это дает мне array([], dtype=object)
, но как я могу развернуть dtype, чтобы проверить, что базовый тип - Test
?
Это легко, когда в массиве есть элементы, так как я могу использовать isinstance
для любого из членов, но когда массив пуст, я в тупике. Я надеюсь, что основной тип хранится в dtype где-то...
Вы не можете. Массивы не предназначены для использования с не примитивными типами (эффективно) и действительно ничем не отличаются от (ужасно медленного) списка. Фактически, как только вы идете объект, вы можете поместить все, что хотите, в массив:
array((Test(),[])) #works fine, dtype object. Even explicitly setting dtype will not fail, and be ignored.
Как вы можете видеть - если вы не ставите примитивный numpy
можете преобразовать его, никакого принуждения типа не будет.
Хотя я бы не рекомендовал массив вообще, если вы можете гарантировать, что массив содержит один тип, тогда
type(arr[0])
на самом деле это ваш единственный вариант (который, конечно, зависит от формы).
object
. Поскольку объект может быть чем угодно, это означает, что вы можете поместить что угодно в массив, а numpy не отслеживает типы для отдельных элементов. Все элементы должны быть одного типа, и способ, которым это обрабатывается, сobject
. Это побеждает цель хранения типа, хотя.