Geben Sie hinting / annotation (PEP 484) für numpy.ndarray ein

74

Hat jemand Typhinweise für die jeweilige numpy.ndarrayKlasse implementiert ?

Im Moment benutze ich typing.Any, aber es wäre schön, etwas Spezifischeres zu haben.

Zum Beispiel , wenn die NumPy Menschen hinzugefügt einen Typen alias für ihre array_like Objektklasse. Besser noch, implementieren Sie die Unterstützung auf dtype- Ebene, damit andere Objekte sowie ufunc unterstützt werden .

Inon
quelle
1
pypi.python.org/pypi/plac kann Py3-Annotationen verwenden, um einen argparseParser zu füllen . Für Py2 werden Dekoratoren verwendet, um eine ähnliche annocationDatenbank zu erstellen .
hpaulj
1
typingist neu in Py 3.5. Viele numpyBenutzer arbeiten immer noch mit Py2. Ich habe 3.5 auf meinem System, aber ich habe nicht dafür numpyinstalliert. numpyEntwickler werden keine Funktionen für die @
neueste Version
1
numpywird in einem githubRepository verwaltet. Schau dir das issuesund an pull requests; Melden Sie sich an und reichen Sie Ihre eigene Ausgabe ein. Es mag ein anderes Forum geben, um Entwicklungsprobleme zu diskutieren, aber die meisten betrachte ich github.
Hpaulj
6
Für alle, die sich mit dem Problem befassen
Itamar Mushkin
1
> Es gibt jetzt ... @Jasha Dieses Ticket wurde vor 4,5 Jahren von mir, dem OP, eröffnet.
Inon

Antworten:

26

Es sieht so aus, als ob das typingModul entwickelt wurde bei:

https://github.com/python/typing

Das Haupt- numpyRepository befindet sich unter

https://github.com/numpy/numpy

Python-Fehler und Commits können unter verfolgt werden

http://bugs.python.org/

Die übliche Methode zum Hinzufügen eines Features besteht darin, das Haupt-Repository zu teilen, das Feature so lange zu entwickeln, bis es bombensicher ist, und dann eine Pull-Anfrage zu senden. Natürlich möchten Sie an verschiedenen Stellen im Prozess Feedback von anderen Entwicklern. Wenn Sie die Entwicklung nicht selbst durchführen können, müssen Sie jemanden davon überzeugen, dass es sich um ein lohnendes Projekt handelt.

cythonhat eine Form von Anmerkungen, mit denen effizienter CCode generiert wird .


Sie haben array-likein der numpyDokumentation auf den Absatz verwiesen . Beachten Sie die typingInformationen:

Eine einfache Möglichkeit, mit array () herauszufinden, ob das Objekt in ein numpy-Array konvertiert werden kann, besteht darin, es einfach interaktiv zu testen und zu prüfen, ob es funktioniert! (Der Python-Weg).

Mit anderen Worten, die numpyEntwickler lehnen es ab, festgehalten zu werden. Sie beschreiben nicht oder nicht in Worten, in welche Arten von Objekten konvertiert werden kann oder nicht 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)

Für Ihre eigenen Funktionen eine Anmerkung wie

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

funktioniert. Wenn Ihre Funktion am Ende eine numpyFunktion aufruft , die ihr Argument durchläuft asanyarray(wie viele), wäre eine solche Anmerkung natürlich unvollständig, da Ihre Eingabe ein list, oder np.matrixusw. sein könnte.


Achten Sie bei der Bewertung dieser Frage und Antwort auf das Datum. 484 war damals ein relativ neues PEP und Code, um es für Standard-Python zu verwenden, das sich noch in der Entwicklung befindet. Es sieht jedoch so aus, als ob die bereitgestellten Links noch gültig sind.

hpaulj
quelle
1
Welche Software, welchen Editor oder Interpreter verwenden Sie, die verwendet wird annotations? Wie ich am besten weiß, erhält eine Funktion in Python 3 ein __annotations__Wörterbuch, aber der Interpreter macht nichts damit.
hpaulj
1
Möchten Sie typingAnmerkungen zu vorhandenen numpyFunktionen (einschließlich np.array) hinzufügen oder nur Typen, die das Hinzufügen von Anmerkungen zu Ihren eigenen Funktionen erleichtern?
hpaulj
3
Ich habe diese Antwort als akzeptiert markiert, aber der Vollständigkeit halber habe ich mich für Letzteres entschieden (geben Sie Hinweise in meinen eigenen Code ein, der Numpy verwendet). Ich bin für Duck Typing, aber wenn Sie können statische Typinformationen zur Verfügung stellen, ich sehe nicht , warum Sie sich nicht, wenn auch nur für statische Code - Analyse (PyCharm über inkompatible Typen warnen). Danke, @hpaulj!
Inon
Da das Tippmodul lediglich Hinweise enthält, habe ich zwei Hilfsbezeichnungen nur zur besseren Lesbarkeit erstellt und festgestellt, dass die statischen Typprüfungen von mypy nicht bestanden werden. def Vector(np_arr): return np_arr.ndim == 1 def Matrix(np_arr): return np_arr.ndim > 1 . Hoffe, es hilft jemandem.
Vitalis
Was ist mit der Form? Ich kann Hinweise wie def blah () -> np.ndarray (785) hinzufügen: Aber ich kann keine zweite Dimension wie -> np.ndarray (785, 10) hinzufügen. Ein Formhinweis ist sehr hilfreich und bringt Klarheit in mehrere Funktionen in meinem Code, die Arrays unterschiedlicher Dimension erzeugen.
Steve3p0
5

Schauen Sie sich DataShape an . Es verwendet die Datentypen sowie eine Syntax für die Größe der Eingabe- und Ausgabearrays.

Back2Basics
quelle
Also ist DataShape eine Numpy- Alternative ? Nicht ganz das, was ich mir vorgestellt hatte, da ich SciPy verwende, für das Numpy explizit erforderlich ist.
Inon
1
DataShape ist eine Beschreibung. Derzeit gibt es keine offiziellen Funktionsanmerkungen, aber bisher ist dies die beste Beschreibung, die ich für Numpy-Typen gesehen habe, wenn Sie Funktionsanmerkungen einbauen möchten. Und ja, ich würde vorschlagen, einen neuen Modulnamen zu erstellen und ihn als Proof of Concept zu verwenden, bevor Funktionsanmerkungen in die Numpy-Quelle eingefügt werden.
Back2Basics
Wie benutzt man DataShape? Die Dokumentation sagt viel darüber aus, was DataShape kann, aber ich finde kein konkretes Beispiel dafür, wie es für Typhinweise in Python verwendet werden kann.
Papierkran
1
Dies ist nur eine Link-Antwort. Es ist vorzuziehen , hier ein Verwendungsbeispiel für diese Bibliothek hinzuzufügen und den Link als Referenz bereitzustellen.
Georgy
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus dem Rückblick
Sergey Shubin
2

Was ich getan habe war, es einfach als zu definieren

Diktieren Sie [Tupel [int, int], TYP]

Wenn Sie beispielsweise eine Reihe von Floats möchten, können Sie Folgendes tun:

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

Dies ist aus Dokumentationssicht natürlich nicht genau, aber für die Analyse der korrekten Verwendung und die ordnungsgemäße Vervollständigung mit pyCharm funktioniert es hervorragend!

Leon Vayman
quelle
13
Dies ist schlimmer als die Verwendung np.ndarrayals Typ
Jules GM
1

In meiner Firma haben wir verwendet:

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.

        def transform_image(image: Array['H,W,3', np.uint8], ...):
            ...

    """
    pass


def func(arr: Array['N,2', int]):
    return arr*2


print(func(arr = np.array([(1, 2), (3, 4)])))

Wir haben tatsächlich einen MyPy-Checker, der überprüft, ob die Formen funktionieren (die wir irgendwann freigeben sollten). Das einzige ist, dass es PyCharm nicht glücklich macht (dh Sie erhalten immer noch die bösen Warnzeilen):

Geben Sie hier die Bildbeschreibung ein

Peter
quelle