Heeft iemand typehints geïmplementeerd voor de specifieke numpy.ndarray
les?
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 typing
is 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
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.
cython
heeft een vorm van annotaties, die het gebruikt om efficiënte C
-code te genereren.
Je hebt verwezen naar de array-like
paragraaf in de numpy
documentatie. 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 numpy
weigeren 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 asanyarray
geeft (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.typing
module met een NDArray
generiek 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):
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!