【问题标题】:Cython error: Undeclared name not built in:arrayCython 错误:未内置未声明的名称:数组
【发布时间】:2013-04-23 17:54:03
【问题描述】:

我正在Sage Cell Server 中编译此 Cython 代码,但出现以下错误。

undeclared name not builtin: array

它在 Sage Notebook 中显示相同的错误。我认为它无法识别 numpy array 但它 很奇怪,因为我已经导入了 numpy。

 cython('''
  cimport numpy as np
  ctypedef np.int DTYPE
  def computeDetCy(np.ndarray[DTYPE, ndim=2] matrix):      
      return determ(matrix,len(matrix))

cdef inline int determ(np.ndarray[DTYPE, ndim=2] matrix, int n):
cdef int det = 0
cdef int p=0
cdef int h
cdef int k
cdef int i=0
cdef int j=0
cdef np.ndarray[DTYPE, ndim=2] temp=np.zeros(4,4)
if n == 1:
    return matrix[0][0]
elif  n == 2:
    return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
else:
    for p in range(0, n):
        h = 0
        k = 0
        for i in range(1, n):
            for j in range(0, n):
                if j==p:
                    continue 
                temp[h][k] = matrix[i][j]
                k+=1
                if k ==(n-1):
                    h+=1
                    k=0
        det= det + matrix[0][p] * (-1)**p * determ(temp, n-1)

    return det

computeDetCy(array([[13,42,43,22],[12,67,45,98],[23,91,18,54],[34,56,82,76]]))

''')

【问题讨论】:

    标签: numpy cython sage


    【解决方案1】:

    是的,但是您将其导入为np,而不是导入*(无论如何这都是个坏主意)并且没有进行常规的Python 导入。 (有时您必须同时使用cimportimport,请参阅this SO question for an example。)

    然而,即使之后

    import numpy as np
    

    使用np.array,我仍然遇到一些错误

    ValueError: Buffer dtype mismatch, expected 'DTYPE' but got 'long'
    

    所以这解决了您的问题,但不是全部,而且我尝试的方法无法解决这个新问题。

    【讨论】:

    • 您的回答解决了报告的问题。第二个问题应该通过将DTYPE的定义更改为ctypedef np.int_t DTYPE来解决(即将ctypedef中的np.int替换为np.int_t)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多