Numpy 学习cython时遇到的问题

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

我正在学习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
然后,我尝试将此代码循环化:

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。