Как я могу определить базовый тип в объектном типе dtype?

1

Если у меня есть собственный класс 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 где-то...

Теги:
numpy

1 ответ

2
Лучший ответ

Вы не можете. Массивы не предназначены для использования с не примитивными типами (эффективно) и действительно ничем не отличаются от (ужасно медленного) списка. Фактически, как только вы идете объект, вы можете поместить все, что хотите, в массив:

array((Test(),[])) #works fine, dtype object. Even explicitly setting dtype will not fail, and be ignored.

Как вы можете видеть - если вы не ставите примитивный numpy можете преобразовать его, никакого принуждения типа не будет.

Хотя я бы не рекомендовал массив вообще, если вы можете гарантировать, что массив содержит один тип, тогда

type(arr[0])

на самом деле это ваш единственный вариант (который, конечно, зависит от формы).

  • 0
    Но не будет ли dtype храниться во внутренней реализации для приведения типов значений при заполнении массива?
  • 1
    @SashaTsukanov это будет - тип object . Поскольку объект может быть чем угодно, это означает, что вы можете поместить что угодно в массив, а numpy не отслеживает типы для отдельных элементов. Все элементы должны быть одного типа, и способ, которым это обрабатывается, с object . Это побеждает цель хранения типа, хотя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню