Was ist der kanonische Weg, um eine numpige Matrix als Argument für eine C-Funktion zu erhalten, die einen Doppelzeiger braucht?
Kontext : Ich verwende numpy
, um einen C-Code zu validieren. Ich habe eine C-Funktion, die ein const double ** const
benötigt, und ich verwende ctypes
, um sie aufzurufen das .so
von Python.
Ich habe es versucht:
%Vor% und übergab die numpy
Matrix direkt (hat nicht funktioniert), sowie
und übergab dann die numpy
-Matrix über verschiedene Umwandlungen. Casting führte zum Python-Fehler
Hinweis : Diese Frage kam vor ein paar Jahren auf hier , aber es gab keine vollkommen erfolgreiche Lösung.
Ich glaube, Sie suchen nach der ctypes
-Schnittstelle in numpys ndarray
s (oder matrix
). Sie können eine hier für mehr Informationen über numpy's Handbuch finden.
Bitte beachten Sie, dass die numpy C-API ndarray
s (oder Matrizen für diese Angelegenheit) mit einem einzigen Zeiger speichert (siehe Ссылка ). Sie können diesen einzelnen Zeiger nicht in einen Doppelzeiger in C umwandeln, nur weil es sich um unterschiedliche Typen handelt. Darüber hinaus speichert numpy nicht nur die Daten dieser Objekte, sondern auch Informationen über die Form der Matrix und die Schritte (wie die Daten auf dem bereitgestellten Datenzeiger organisiert sind). Ohne all diese Informationen zu kennen, funktioniert Ihr Code nicht unter allen Bedingungen. Wenn Sie beispielsweise eine Matrix transponieren, bevor Sie sie mit Ihrem Code verknüpfen, erhalten Sie unerwartete Ergebnisse!
Abhängig von Ihren Einstellungen gibt es ein paar Lösungen:
Wenn Sie die API Ihrer Bibliothek ändern können, ändern Sie sie so, dass Sie nicht nur Informationen über den Datenzeiger, sondern auch über die Form der Matrix und ihre Schritte weitergeben können. Verwenden Sie dann den obigen Link, um herauszufinden, wie Sie die numpy / ctypes-Unterstützung mit Ihrer neuen API verbinden können.
Wenn Sie Ihre API nicht ändern können, empfehle ich Ihnen, eine Python-Funktion basierend auf ctypes zu erstellen, die den Inhalt des numpy-Arrays in eine mit ctypes selbst erstellte Doppelzeigermatrix konvertiert ( wie in dieser Diskussion vorgeschlagen ). Fügen Sie außerdem Unterstützung für die numpige Objektform und Schrittgröße hinzu, damit Sie die Konvertierung ordnungsgemäß ausführen können. Übergeben Sie nach der Konvertierung die neu erstellte Doppelzeigerstruktur an Ihre ursprüngliche Funktion.