Cython: несоответствие типа буфера, ожидаемое "int", но полученное "long"
у меня возникли проблемы с передачей в этом memoryview целых чисел в эту (довольно тривиальную) функцию. Python дает мне эту ошибку:
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
кто-нибудь может помочь мне понять что происходит? Поиск вокруг stackoverflow, похоже, связан с тем, как python интерпретирует типы и как C интерпретирует типы.
%%cython
def myfunction(int [:] y):
pass
# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)
это производит ValueError
сверху.
EDIT: вот некоторые другие вещи, которые я обнаруженный.
чтобы уточнить, эта ошибка сохраняется, если я объявляю y
следующим образом:
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)
однако, это работает, если я объявляю y
С
y = np.array([0, 0, 1, 1], dtype=np.int32)
кто-нибудь хочет дать предположение, почему это так? Бросали бы в np.int32
работать на разных компьютерах? (Я использую MacBook pro retina, 2013.)
3 ответов
вы используете на Cython это int
тип, который просто C
int
. Я думаю, что на Mac (или большинстве архитектур) это int 32-бит. См.wiki или корпорация Intel или зависит ли размер int от компилятора и / или процессора?
С другой стороны, long
значит в int64. dtype='int'
или dtype=np.int
все эквивалентно np.int64
.
Я думаю, ты просто явно определить его как один из numpy
тип:
cimport numpy as np
import numpy as np
cdef myfunction(np.ndarray[np.int64_t, ndim=1] y):
#do something
pass
таким образом, он читает более ясно, и позже не будет никакой путаницы.
редактировать
новая memoryviews синтаксис будет такой:
cdef myfunction(double[:] y):
#do something with y
pass
Я сделал то, что сообщение об ошибке говорит мне: я изменил memoryview
базовый тип от int
to long
и, похоже, это сработало.
%%cython
def fun(long[:] x):
return x[0]
y=np.array([1,2,3],dtype=int)
fun(y) # returns 1
У меня была та же проблема. Мотивированный ответом Yibo, я использовал .astype (int), который решил проблему.