code

numpy.ndarray에 대한 힌트/주석 입력(PEP 484)

starcafe 2023. 5. 13. 10:28
반응형

numpy.ndarray에 대한 힌트/주석 입력(PEP 484)

특정 클래스에 대해 유형 암시를 실행한 사람이 있습니까?

지금은 사용하고 있지만 좀 더 구체적인 것이 있으면 좋을 것 같습니다.

예를 들어, NumPy 사용자가 array_like 객체 클래스에 대한 유형 별칭을 추가한 경우.더 나은 것은, ufunc뿐만 아니라 다른 개체도 지원할 수 있도록 dtype 수준에서 지원을 구현하는 것입니다.

갱신하다

최신 Numpy 버전에서 새 항목 확인typing모듈

https://numpy.org/doc/stable/reference/typing.html#module-numpy.typing

날짜가 정해진 대답

처럼 보입니다.typing모듈 개발 위치:

https://github.com/python/typing

메인numpy저장소 위치

https://github.com/numpy/numpy

Python 버그 및 커밋은 다음에서 추적할 수 있습니다.

http://bugs.python.org/

기능을 추가하는 일반적인 방법은 기본 리포지토리를 포크하고 기능이 폭탄 방지가 될 때까지 개발한 다음 끌어오기 요청을 제출하는 것입니다.프로세스의 다양한 시점에서 다른 개발자의 피드백을 원하는 것은 분명합니다.만약 당신이 직접 개발을 할 수 없다면, 당신은 그것이 가치 있는 프로젝트라고 다른 사람을 설득해야 합니다.

cython주석의 형태를 가지며, 이는 효율적으로 생성하는 데 사용됩니다.C암호를


당신은 다음을 참조했습니다.array-like의 단락.numpy문서화참고:typing정보:

array()를 사용하여 객체를 numpy 배열로 변환할 수 있는지 확인하는 간단한 방법은 대화식으로 시도하고 작동하는지 확인하는 것입니다! (Python Way).

다른 말로 하면,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에 사용하기 위한 코드입니다.하지만 제공된 링크는 여전히 유효한 것 같습니다.

Numpy 1.21은 다음을 포함합니다.numpy.typing을 구성합니다.NDArray제네릭 형식


Numpy 1.21 문서에서:
numpy.typing.NDArray = numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]]

의 일반 입니다.np.ndarray[Any, np.dtype[+ScalarType]].

지정된 dtype과 지정되지 않은 모양을 가진 배열을 입력하기 위해 런타임 중에 사용할 수 있습니다.

예:

>>> import numpy as np
>>> import numpy.typing as npt

>>> print(npt.NDArray)
numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]]

>>> print(npt.NDArray[np.float64])
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]

>>> NDArrayInt = npt.NDArray[np.int_]
>>> a: NDArrayInt = np.arange(10)

>>> def func(a: npt.ArrayLike) -> npt.NDArray[Any]:
...     return np.array(a)

2022-09-05 현재, 도형 지원은 numpy/numpy#16544에 따라 여전히 진행 중인 작업입니다.

당사에서는 다음을 사용해 왔습니다.

from typing import TypeVar, Generic, Tuple, Union, Optional
import numpy as np

Shape = TypeVar("Shape")
DType = TypeVar("DType")

class Array(np.ndarray, Generic[Shape, DType]):
    """  
    Use this to type-annotate numpy arrays, e.g. 
        image: Array['H,W,3', np.uint8]
        xy_points: Array['N,2', float]
        nd_mask: Array['...', bool]
    """
    pass

def compute_l2_norm(arr: Array['N,2', float]) -> Array['N', float]:
    return (arr**2).sum(axis=1)**.5

print(compute_l2_norm(arr = np.array([(1, 2), (3, 1.5), (0, 5.5)])))

우리는 실제로 이 주변에 MyPy 검사기를 가지고 있습니다. 이 검사기는 모양이 잘 되는지 확인합니다(어느 시점에 공개해야 합니다).유일한 것은 PyCharm을 만족시키지 못한다는 것입니다(즉, 여전히 불쾌한 경고 라인이 표시됩니다).

여기에 이미지 설명 입력

nptyping은 numpy 유형 힌트를 지정할 수 있는 많은 유연성을 제공합니다.

내가 한 일은 그저 그것을 정의하는 것이었습니다.

받아쓰기[Tuple[int, int], TYPE]

예를 들어, 플로트 배열을 원하는 경우 다음을 수행할 수 있습니다.

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

물론 문서화 관점에서 정확한 것은 아니지만, 정확한 사용법을 분석하고 pyCharm을 사용하여 적절한 완성을 얻는 데는 매우 유용합니다.

언급URL : https://stackoverflow.com/questions/35673895/type-hinting-annotation-pep-484-for-numpy-ndarray

반응형