Как набрать переменную, которая передается в numpy.asarray для создания двумерного массива с плавающей точкой? - PullRequest
0 голосов
/ 31 января 2019

Я часто пишу функции / методы, которые принимают некоторую переменную, которая может иметь различные формы, например, списки списков, списки кортежей, кортежи кортежей и т. Д., Содержащие числа, которые я хочу преобразовать в массив с пустыми значениями,вроде как следующее:

import numpy as np

def my_func(var: 'what-freaking-type-here') -> np.ndarray:
    a = np.asarray(var, dtype=np.float64) # type: np.array[np.float] maybe?
    return a

По сути, мой вопрос заключается в том, как правильно набрать это, учитывая, что я могу передать все виды значений этой функции, чтобы в итоге создать 2D массив с плавающей точкой (обратите внимание, что это всего лишь пример, а размерность и тип должны быть взаимозаменяемыми):

my_func([[0], [0]])
my_func([(0,), (2.3,)])
my_func(((0,), [2.3,]))
my_func(np.arange(100).reshape(10, 10))

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

1 Ответ

0 голосов
/ 11 февраля 2019

Попробуйте numpy-заглушки: экспериментальные заглушки для NumPy .

Определяет тип функции np.array() следующим образом:

def array(
    object: object,
    dtype: _DtypeLike = ...,
    copy: bool = ...,
    subok: bool = ...,
    ndmin: int = ...,
) -> ndarray: ...

Какиеберет любое значение object для содержимого и возвращает тип ndarray.

Это работа в процессе.Сообщите, если это эффективно на данном этапе.

Есть также более старый проект numpy-mypy .Как отмечается,

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

Он определяет тип функции np.array() следующим образом:

def array(object: Any, dtype: Any=None, copy: bool=True,
          order: str=None, subok: bool=False,
          ndmin: int=0) -> ndarray[Any]: ...

, который принимает Any для содержимого (там нет проверки типов) и возвращает тип ndarray, который параметризован (универсальный) по типу элемента.

...