Cython:缓冲区类型不匹配,预期'int'但得到'long'

hli*_*117 9 python numpy cython memoryview

我无法将这个整数的内存视图传递给这个(相当简单的)函数.Python给了我这个错误:

ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解发生了什么吗?搜索stackoverflow,似乎它与python如何解释类​​型以及C如何解释类​​型有关.

%%cython
def myfunction(int [:] y):
    pass

# Python code
import numpy as np
y = np.array([0, 0, 1, 1])
myfunction(y)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

然而,它的工作原理,如果我宣布y

y = np.array([0, 0, 1, 1], dtype=np.int32)
Run Code Online (Sandbox Code Playgroud)

有没有人想提出为什么会这样的建议?会np.int32在不同的电脑上投入工作吗?(我使用macbook pro retina,2013年.)

CT *_*Zhu 12

你正在使用Cython的int类型C int.我认为在Mac(或大多数架构)上它是int 32位.请参阅wikiintelint的大小是否取决于编译器和/或处理器?

另一方面,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
Run Code Online (Sandbox Code Playgroud)

这样它读得更清楚,以后也不会有任何混淆.

编辑

较新的memoryviews语法将如下所示:

cdef myfunction(double[:] y):
    #do something with y
    pass
Run Code Online (Sandbox Code Playgroud)

  • 我相信memoryview语法现在更倾向于将它声明为一个numpy数组(它更常用,并且速度基本相同).关于`np.int64`的观点是正确的. (2认同)