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

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

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

78
Inon 27 Фев 2016 в 21:44

4 ответа

Лучший ответ

Похоже, что модуль 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 (), - просто попробовать его в интерактивном режиме и посмотреть, работает ли он! (Путь Python).

Другими словами, разработчики 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 и т. д.


Оценивая этот вопрос и ответ, обратите внимание на дату. 484 тогда был относительно новым PEP, и код для его использования для стандартного Python все еще находился в разработке. Но похоже, что предоставленные ссылки все еще действительны.

25
Georgy 21 Авг 2020 в 10:19

Я просто определил это как

Dict [кортеж [int, int], TYPE]

Так, например, если вам нужен массив с плавающей запятой, вы можете:

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

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

2
Leon Vayman 18 Окт 2016 в 19:39

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

5
Back2Basics 27 Фев 2016 в 23:28

nptyping добавляет большую гибкость для указания подсказок типа numpy.

-1
EpicAdv 16 Сен 2020 в 17:40