Тип hinting/annotation (PEP 484) для numpy.ndarray

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

Сейчас я использую typing.Any, но было бы неплохо иметь что-то более конкретное.

Например, если пользователи numpy добавили псевдоним типа для своего класса объектов array_like. Еще лучше, реализуйте поддержку на уровне dtype, чтобы другие объекты поддерживались, а также ufunc.

Ответы

Ответ 1

Похоже, что модуль typing был разработан:

https://github.com/python/typing

Основной репозиторий numpy находится в

https://github.com/numpy/numpy

Ошибки и коммиты Python можно отслеживать в

http://bugs.python.org/

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

cython имеет форму аннотаций, которую он использует для генерации эффективного кода C.


Вы ссылаетесь на абзац array-like в документации numpy. Обратите внимание на информацию typing:

Простой способ узнать, может ли объект быть преобразован в массив numpy с помощью array(), просто попробуйте в интерактивном режиме и посмотрите, работает ли он! (Путь Питона).

Другими словами, разработчики numpy отказываются прижаться. Они не могут или не могут описать словами, какие объекты могут или не могут быть преобразованы в np.ndarray.

In [586]: np.array({'test':1})   # a dictionary
Out[586]: array({'test': 1}, dtype=object)

In [587]: np.array(['one','two'])  # a list
Out[587]: 
array(['one', 'two'], 
      dtype='<U3')

In [589]: np.array({'one','two'})  # a set
Out[589]: array({'one', 'two'}, dtype=object)

Для ваших собственных функций примечание типа

def foo(x: np.ndarray) -> np.ndarray:

работает. Конечно, если ваша функция заканчивается вызовом некоторой функции numpy, которая передает свой аргумент через asanyarray (как это делают многие), такая аннотация будет неполной, так как ваш вход может быть list или np.matrix и т.д..

Ответ 2

Отъезд DataShape. Он использует типы данных, а также некоторый синтаксис того, насколько велики должны быть массивы ввода и вывода.

Ответ 3

Что я сделал, так это просто определить его как

Dict [Tuple [int, int], TYPE]

Так, например, если вы хотите создать массив поплавков:

a = numpy.empty(shape=[2, 2], dtype=float) # type: Dict[Tuple[int, int], float]

Это, конечно, не точно с точки зрения документации, но для анализа правильного использования и получения правильного завершения с pyCharm он отлично работает!