Ich habe Probleme, in diesem memoryview von ganzen Zahlen in diese (eher triviale) Funktion zu gehen. Python gibt mir diesen Fehler:Cython: Fehlertyp des Puffertyps, erwartet 'int', aber 'lang'
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
Kann mir jemand helfen zu verstehen, was vor sich geht? Bei der Suche nach stackoverflow scheint es damit zu tun zu haben, wie python Typen interpretiert und wie C Typen interpretiert.
%%cython
def myfunction(int [:] y):
pass
# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)
Dies erzeugt die ValueError
von oben.
EDIT: Hier sind einige andere Dinge, die ich entdeckt habe.
Um zu klären, bleibt dieser Fehler, wenn ich y
folgende Möglichkeiten erklären:
y = np.array([0, 0, 1, 1], dtype='int')
y = np.array([0, 0, 1, 1], dtype=np.int)
y = np.array([0, 0, 1, 1], dtype=np.int64)
Allerdings funktioniert es, wenn ich y
mit
y = np.array([0, 0, 1, 1], dtype=np.int32)
erklären
Hat jemand einen Vorschlag, warum diese geben wollen ist der Fall? Würden np.int32
auf verschiedenen Computern arbeiten? (Ich benutze ein macbook pro Retina, 2013.)
Danke für die Einsicht. Würde "np.int64_t" auf jedem Computer funktionieren? (Ich weiß, dass ich gefragt habe, ob das Eingeben von 'dtype = np.int32' auf allen Computern funktionieren würde, aber diese Option war im Python-Code. Ich frage mich, ob die oben beschriebene Option' np.int64_t' auf allen Computern funktioniert , da es Cython-Code ist.) – hlin117
Ich denke schon. Weil es in der Funktionsdeklaration ist, solange wir ein 'np.int64'-Array an es übergeben, wird es gut gehen. Wie intern 'np.int64_t' würde in 'C' übersetzt werden, geben Sie das' numpy' Problem an, nicht unser Problem (und ich würde darauf vertrauen, dass es schon erledigt ist,: P). Entschuldigung, das ist keine definitive Antwort, aber ich habe diese Verwendung oft in Tutorials und Code anderer Leute gesehen. –
Ich glaube, die Memoryview-Syntax wird jetzt bevorzugt, um es als ein numpy Array zu deklarieren (es funktioniert allgemeiner und im Grunde die gleiche Geschwindigkeit). Der Punkt über die 'np.int64' ist jedoch richtig. – DavidW