Cython:缓冲区类型不匹配,预期' int'但是得到了很长的'

时间:2015-08-28 03:39:56

标签: python numpy cython 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

编辑:以下是我发现的其他一些事情。

为了澄清,如果我通过以下方式声明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 个答案:

答案 0 :(得分:12)

您使用的是Cython的int类型,它只是C int。我认为在Mac(或大多数架构)上它是int 32位。请参阅wikiintelDoes the size of an int depend on the compiler and/or processor?

另一方面,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

答案 1 :(得分:1)

我做了错误消息告诉我的内容:我将memoryview基本类型从int更改为long,它似乎有效。

%%cython
def fun(long[:] x):
    return x[0]

y=np.array([1,2,3],dtype=int)
fun(y)    # returns 1

答案 2 :(得分:0)

我遇到了同样的问题。在Yibo的回答的推动下,我使用了.astype(int)来解决这个问题。