我用cython编写了一个简单的插值函数,可以从其他cython代码调用(很多)。其中一个参数是numpy数组:
@cython.boundscheck(False)
@cython.cdivision(True)
@cython.wraparound(False)
cdef double interpU_cython(double kX,double kY,int iX,int iY, int iTheta,int nbX,int nbY,np.ndarray[double, ndim=3] u, double outVal):
cdef double uPt, u0, u1
if (iX >= 0 and iY >= 0 and iX < nbX-1 and iY < nbY-1):
u0 = u[iX,iY,iTheta] + (u[iX+1,iY,iTheta]-u[iX,iY,iTheta]) * kX
u1 = u[iX,iY+1,iTheta] + (u[iX+1,iY+1,iTheta]-u[iX,iY+1,iTheta]) * kX
uPt = u0 + (u1-u0) * kY
else:
uPt = outVal
return uPt
我用cython-a检查了python调用,看起来函数调用依赖于几个python调用:
^{pr2}$有没有一种有效的方法来传递和使用numpy数组而不产生显著的开销,或者我应该只使用c数组来处理代码的c编译部分中的所有内容?在
使用指向numpy数组第一个元素的指针并在参数中添加数组大小以将其用作一维数组是否安全?在
谢谢
看看https://jakevdp.github.io/blog/2012/08/08/memoryview-benchmarks/
这篇博客文章比较了在Cython中使用NumPy数组的几种可能性。在
简而言之,您应该使用声明为
double[:,:,:] u
而不是np.ndarray[double, ndim=3] u
的类型化内存视图。文件:http://docs.cython.org/en/latest/src/userguide/memoryviews.html编辑:可以查询内存视图的形状
相关问题 更多 >
编程相关推荐