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), который решил проблему.