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位.请参阅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
Run Code Online (Sandbox Code Playgroud)
这样它读得更清楚,以后也不会有任何混淆.
编辑
较新的memoryviews语法将如下所示:
cdef myfunction(double[:] y):
#do something with y
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8289 次 |
| 最近记录: |