Cython Python: предыдущее объявление находится здесь, когда я создаю __init__ класса

#python #numpy #cython

#python #numpy #cython

Вопрос:

Я новичок в Cython, приведенный ниже код предназначен для инициализации класса A:

  • python3.6
  • cython0.28
  • numpy 1.14.5

a.pyx

 from __future__ import division
cimport cython
from libcpp cimport bool
cimport numpy as np
import numpy as np

DTYPE = np.float64
ctypedef np.float64_t DTYPE_t
TTYPE = np.int64
ctypedef np.int64_t TTYPE_t


cdef class A():
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def __init__(self, np.ndarray[DTYPE_t, ndim=2, mode='c'] _cost_matrix):
        cdef np.ndarray[DTYPE_t, ndim=2] _cost_matrix = np.atleast_2d(_cost_matrix)
        ...

  

Ошибка заключается в ошибке компиляции файла Cython:

 ------------------------------------------------------------


    @cython.boundscheck(False)
    @cython.wraparound(False)
    def __init__(self, np.ndarray[DTYPE_t, ndim=2, mode='c'] _cost_matrix):

linear_assignment_cython.pyx:72:23: Previous declaration is here
Traceback (most recent call last):                      
------------------------------------------------------------
  

setup.py

 # coding: UTF-8
"""
    @author: samuel ko
"""
from distutils.core import setup
from Cython.Build import cythonize
import numpy

setup(
    name="haha",
    ext_modules=cythonize("a.pyx"),
    include_dirs=[numpy.get_include()],
)
  

Интересно, позиция include_dirs numpy должна быть явно указана в абсолютных каталогах?

Каталог моего пути к ядру numpy: /usr/local/lib/python3.6/dist-packages/numpy/core/include и я изменил его на replace numpy.get_include() , но все еще не работает.

Действительно надеюсь, что ваша доброта поможет, большое вам спасибо ^.^ ~

Ответ №1:

Вы определили _cost_matrix дважды. Один раз как ввод функции и один раз как локальная переменная. Второе назначение (после np.atleast_2d ) бессмысленно, потому что вы уже убедились, что ввод функции представляет собой 2D-массив.

Возможно, вам было бы лучше сделать:

 def __init__(self, _cost_matrix_in): # untyped variable in, different name
    # then ensure it's 2D and enforce the type.
    cdef np.ndarray[DTYPE_t, ndim=2] _cost_matrix = np.atleast_2d(_cost_matrix)