Typ hint/annotatie (PEP 484) voor numpy.ndarray

Heeft iemand typehints geïmplementeerd voor de specifieke numpy.ndarrayles?

Op dit moment gebruik ik typing.Any, maar het zou leuk zijn om iets specifiekers te hebben.

Als de NumPy-mensen bijvoorbeeld een alias typenvoor hun array_likeobjectklasse. Beter nog, implementeer ondersteuning op het niveau dtype, zodat andere objecten worden ondersteund, evenals ufunc.


Antwoord 1, autoriteit 100%

Bijwerken

Controleer recente numpy-versies voor een nieuwe typing-module

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

gedateerd antwoord

Het lijkt erop dat de module typingis ontwikkeld op:

https://github.com/python/typing

De belangrijkste numpy-repository bevindt zich op

https://github.com/numpy/numpy

Python-bugs en commits kunnen worden gevolgd op

http://bugs.python.org/

De gebruikelijke manier om een ​​functie toe te voegen is door de hoofdrepository te forken, de functie te ontwikkelen totdat deze bombestendig is en vervolgens een pull-verzoek in te dienen. Uiteraard wil je op verschillende momenten in het proces feedback van andere ontwikkelaars. Als je de ontwikkeling niet zelf kunt doen, moet je iemand anders ervan overtuigen dat het een waardevol project is.

cythonheeft een vorm van annotaties, die het gebruikt om efficiënte C-code te genereren.


Je hebt verwezen naar de array-likeparagraaf in de numpydocumentatie. Let op de informatie over typing:

Een eenvoudige manier om erachter te komen of het object kan worden geconverteerd naar een numpy-array met array() is door het interactief te proberen en te kijken of het werkt! (De Python-manier).

Met andere woorden, de ontwikkelaars van numpyweigeren zich te laten vastpinnen. Ze kunnen of kunnen niet in woorden beschrijven welke soorten objecten wel of niet kunnen worden geconverteerd naar 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)

Voor uw eigen functies, een annotatie zoals

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

werkt. Als je functie uiteindelijk een numpy-functie aanroept die zijn argument door asanyarraygeeft (zoals velen doen), zou zo’n annotatie onvolledig zijn, omdat je invoer een list, of np.matrix, enz.


Let bij het evalueren van deze vraag en het antwoord op de datum. 484 was toen een relatief nieuwe PEP en code om het te gebruiken voor standaard Python nog in ontwikkeling. Maar het lijkt erop dat de geleverde links nog steeds geldig zijn.


Antwoord 2, autoriteit 36%

Numpy 1.21 bevat een numpy.typingmodule met een NDArraygeneriek type.


Van de Numpy 1.21 documenten:
numpy.typing.NDArray = numpy.ndarray[typing.Any, numpy.dtype[+ScalarType]

Een generieke versie van np.ndarray[Any, np.dtype[+ScalarType]].

Kan tijdens runtime worden gebruikt voor het typen van arrays met een bepaald dtype en een niet-gespecificeerde vorm.

Voorbeelden:

>>> 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)

Vanaf 11/10/2021 is ondersteuning voor vormen nog steeds een werk in uitvoering volgens numpy/ numpy#16544.


Antwoord 3, autoriteit 34%

Bij mijn bedrijf gebruiken we:

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)])))

We hebben hier eigenlijk een MyPy-checker omheen die controleert of de vormen werken (die we op een gegeven moment zouden moeten vrijgeven). Het enige is dat PyCharm er niet blij van wordt (dwz je krijgt nog steeds de vervelende waarschuwingsregels):

voer hier de afbeeldingsbeschrijving in


Antwoord 4, autoriteit 11%

Bekijk DataShape. Het maakt gebruik van de datatypes en enige syntaxis voor hoe groot de invoer- en uitvoerarrays moeten zijn.


Antwoord 5, autoriteit 11%

nptypingvoegt veel flexibiliteit toe voor het specificeren van numpy type-hints.


Antwoord 6

Wat ik deed was om het te definiëren als

Dict[Tuple[int, int], TYPE]

Dus als je bijvoorbeeld een array van floats wilt, kun je het volgende doen:

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

Dit is natuurlijk niet exact vanuit een documentatieperspectief, maar voor het analyseren van correct gebruik en het verkrijgen van de juiste voltooiing met pyCharm werkt het geweldig!

Other episodes