我无法将这个整数记忆视图传递给这个(相当简单的)函数。 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年。)
答案 0 :(得分:12)
您使用的是Cython的int
类型,它只是C
int
。我认为在Mac(或大多数架构)上它是int 32位。请参阅wiki或intel或Does 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)来解决这个问题。