python到cython-消除python调用

python到cython-消除python调用,python,numpy,cython,Python,Numpy,Cython,我目前正在尝试将以下循环转换为cython: cimport numpy as np cimport cython @cython.boundscheck(False) # turn of bounds-checking for entire function def Interpolation(cells, int nmbcellsx): cdef np.ndarray[float, ndim=1] x,y,z cdef int i,j,len for i in ran

我目前正在尝试将以下循环转换为cython:

cimport numpy as np
cimport cython
@cython.boundscheck(False) # turn of bounds-checking for entire function
def Interpolation(cells, int nmbcellsx):
    cdef np.ndarray[float, ndim=1] x,y,z
    cdef int i,j,len
    for i in range(nmbcellsx):
      x = cells[i].x
      y = cells[i].y
      z = cells[i].z
      len = x.size
      for j in range(len):
         x[j] = x[j] * y[j] * z[j]

    return 0
到目前为止,一切看起来都还不错,但是对单元格[i].*的访问仍然需要python调用。这防止了i-loop的并行化

下面是使用cython-a生成的cython反馈:

因此,问题是:如何删除这些python回调,即第9-12行变为白色

当我尝试添加如下单元格类型时:

cimport numpy as np
cimport cython

cdef class cell_t:
   cdef np.ndarray x,y,z

@cython.boundscheck(False) # turn of bounds-checking for entire function
def Interpolation(np.ndarray[cell_t,ndim=1] cells, int nmbcellsx):
    cdef np.ndarray[float, ndim=1] x,y,z
    cdef int i,j,len
    for i in range(nmbcellsx):
      x = cells[i].x
      y = cells[i].y
      z = cells[i].z
      len = x.size
      for j in range(len):
         x[j] = x[j] * y[j] * z[j]

    return 0
我收到以下cython错误:dtype必须是object、numeric类型或它正在抱怨声明中的单元格的结构

非常感谢。

您没有告诉Cython您的cells参数的类型,因此它将使用Python查找方法。尝试将定义更改为以下内容:

def插值NP.ndarray单元格,int nmbcellsx:

这将告诉Cython它正在获取ndarray类型,因此可以使用C访问。

您没有告诉Cython单元格参数的类型,因此它将使用Python查找方法。尝试将定义更改为以下内容:

def插值NP.ndarray单元格,int nmbcellsx:

这将告诉Cython它正在获取ndarray类型,因此可以使用C访问。

使用如何

以下是测试代码:

import numpy as np
from cells import cell_t, Interpolation

x = np.array([1,2,3], np.float32)
y = np.array([4,5,6], np.float32)
z = np.array([7,8,9], np.float32)
c1 = cell_t(x, y, z)

x = np.array([1,1,1,1,1], np.float32)
y = np.array([2,2,2,2,2], np.float32)
z = np.array([3,3,3,3,3], np.float32)
c2 = cell_t(x, y, z)

cells = np.array([c1, c2], object)

Interpolation(cells, 2)

print c1.x.base
print c2.x.base
以及输出:

[  28.   80.  162.]
[ 6.  6.  6.  6.  6.]
使用如何

以下是测试代码:

import numpy as np
from cells import cell_t, Interpolation

x = np.array([1,2,3], np.float32)
y = np.array([4,5,6], np.float32)
z = np.array([7,8,9], np.float32)
c1 = cell_t(x, y, z)

x = np.array([1,1,1,1,1], np.float32)
y = np.array([2,2,2,2,2], np.float32)
z = np.array([3,3,3,3,3], np.float32)
c2 = cell_t(x, y, z)

cells = np.array([c1, c2], object)

Interpolation(cells, 2)

print c1.x.base
print c2.x.base
以及输出:

[  28.   80.  162.]
[ 6.  6.  6.  6.  6.]

cells参数属于什么类型。如果你给Cython一个提示,你也许可以让它认出它。也可以作为旁注。您似乎根本没有从与循环相关的函数返回任何内容,循环也没有改变任何非局部的内容。这只是一个更复杂函数的简化示例。cells实际上是调用Cell的对象的一个数组。假设Cell类只有numpy数组x、y和z。我如何解决这个问题?经过一段时间之后,我似乎找不到任何包含3个其他numpy.ndarray的类型的方法,而且这个嵌套结构似乎还不受支持。甚至三年后。细胞的争论是什么类型的。如果你给Cython一个提示,你也许可以让它认出它。也可以作为旁注。您似乎根本没有从与循环相关的函数返回任何内容,循环也没有改变任何非局部的内容。这只是一个更复杂函数的简化示例。cells实际上是调用Cell的对象的一个数组。假设Cell类只有numpy数组x、y和z。我如何解决这个问题?经过一段时间之后,我似乎找不到任何包含3个其他numpy.ndarray的类型的方法,而且这个嵌套结构似乎还不受支持。甚至三年后。不幸的是,这并没有改变任何事情。我猜我必须告诉cython细胞的确切组成,但我该怎么做呢?顺便说一句,您可以使用cython-a file.py编译上面的示例,然后查看生成的file.html行9-12是否需要变白不幸的是,这不会改变任何东西。我猜我必须告诉cython细胞的确切组成,但我该怎么做呢?顺便说一句,你可以用cython-a file.py编译上面的例子,然后查看生成的file.html行9-12需要变白谢谢,这非常接近实际的解决方案,但在并行化方面还有一个小障碍。Cython似乎在x、y和z数组不为空时添加了一些检查,请参见。看,我找不到关闭此支票的选项。你知道这是否可行吗?另一方面,我们的目标是取消对第21行的注释。谢谢,这非常接近实际的解决方案,但在并行化方面仍然有一个小障碍。Cython似乎在x、y和z数组不为空时添加了一些检查,请参见。看,我找不到关闭此支票的选项。你知道这是否可行吗?在旁注中,目标是取消对第21行的注释。