Numpy 学习cython时遇到的问题
我正在学习cython来加速numpy。我写了一段代码,看看如何优化numpy数组计算。 python代码是:Numpy 学习cython时遇到的问题,numpy,cython,Numpy,Cython,我正在学习cython来加速numpy。我写了一段代码,看看如何优化numpy数组计算。 python代码是: from numpy import * def set_onsite(n): a=linspace(0,n,n+1) onsite=zeros([n+1,n+1],float) for i in range(0,n+1): onsite[i,i]=a[i]*a[i] return onsite 然后,我尝试将此代码循环化: impor
from numpy import *
def set_onsite(n):
a=linspace(0,n,n+1)
onsite=zeros([n+1,n+1],float)
for i in range(0,n+1):
onsite[i,i]=a[i]*a[i]
return onsite
然后,我尝试将此代码循环化:
import numpy as np
cimport numpy as np
cimport cython
import cython
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def set_onsite(np.int_t n):
cdef np.ndarray[double,ndim=1,mode='c'] a=np.linspace(0,n,n+1)
cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty(n+1,n+1)
cdef np.int_t i
for i in range(0,n+1):
onsite[i,i]=a[i]*a[i]
return onsite
运行setup.py文件后,我得到了.so文件。我运行了代码%timeit myfile.set\u现场(10000)
,但IPython显示
TypeError:无法理解数据类型
有人能告诉我这是怎么回事吗?
我检查了我的代码很多次,但我没有找出问题出在哪里 问题与cython无关;只是
np.empty
希望第一个参数是作为int或int的元组给出的形状。第二个参数被解释为数据类型:
In [19]: np.empty(5,5)
TypeError: data type not understood
而np.empty((5,5))
返回形状(5,5)的空数组。
所以用
cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty((n+1,n+1))
注意n+1,n+1
周围的两组括号。或者,使用np.zeros
而不是np.empty
使Cython函数与Python函数匹配
PS:调试Python时,不仅要注意错误消息,还要注意引发异常的行:
File "comp.pyx", line 13, in comp.set_onsite (comp.c:1290)
cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty(n+1,n+1)
TypeError: data type not understood
这个问题与cython无关;只是
np.empty
希望第一个参数是作为int或int的元组给出的形状。第二个参数被解释为数据类型:
In [19]: np.empty(5,5)
TypeError: data type not understood
而np.empty((5,5))
返回形状(5,5)的空数组。
所以用
cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty((n+1,n+1))
注意n+1,n+1
周围的两组括号。或者,使用np.zeros
而不是np.empty
使Cython函数与Python函数匹配
PS:调试Python时,不仅要注意错误消息,还要注意引发异常的行:
File "comp.pyx", line 13, in comp.set_onsite (comp.c:1290)
cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty(n+1,n+1)
TypeError: data type not understood
非常感谢你!!它起作用了。但我还有一个问题。我计算时间。结果非常接近。那么,我是否可以通过使用cython来加快速度?对不起,我不知道如何提高性能。不过,你可能想问一个新问题,因为我不太了解Cython。非常感谢!!它起作用了。但我还有一个问题。我计算时间。结果非常接近。那么,我是否可以通过使用cython来加快速度?对不起,我不知道如何提高性能。不过,你可能想问一个新问题,因为我不太了解Cython。