我正在尝试使用 Cython加快这里的答案。我尝试编译代码(在完成此处cygwinccompiler.py解释的 hack之后),但出现错误。谁能告诉我这是我的代码有问题,还是 Cython 有一些深奥的微妙之处?fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated
cygwinccompiler.py
fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated
下面是我的代码。
import numpy as np import scipy as sp cimport numpy as np cimport cython cdef inline np.ndarray[np.int, ndim=1] fbincount(np.ndarray[np.int_t, ndim=1] x): cdef int m = np.amax(x)+1 cdef int n = x.size cdef unsigned int i cdef np.ndarray[np.int_t, ndim=1] c = np.zeros(m, dtype=np.int) for i in xrange(n): c[<unsigned int>x[i]] += 1 return c cdef packed struct Point: np.float64_t f0, f1 @cython.boundscheck(False) def sparsemaker(np.ndarray[np.float_t, ndim=2] X not None, np.ndarray[np.float_t, ndim=2] Y not None, np.ndarray[np.float_t, ndim=2] Z not None): cdef np.ndarray[np.float64_t, ndim=1] counts, factor cdef np.ndarray[np.int_t, ndim=1] row, col, repeats cdef np.ndarray[Point] indices cdef int x_, y_ _, row = np.unique(X, return_inverse=True); x_ = _.size _, col = np.unique(Y, return_inverse=True); y_ = _.size indices = np.rec.fromarrays([row,col]) _, repeats = np.unique(indices, return_inverse=True) counts = 1. / fbincount(repeats) Z.flat *= counts.take(repeats) return sp.sparse.csr_matrix((Z.flat,(row,col)), shape=(x_, y_)).toarray()
在你的setup.py,Extension应该有说法include_dirs=[numpy.get_include()]。
setup.py
Extension
include_dirs=[numpy.get_include()]
此外,您的代码中缺少np.import_array()您的代码。
np.import_array()
--
示例 setup.py:
from distutils.core import setup, Extension from Cython.Build import cythonize import numpy setup( ext_modules=[ Extension("my_module", ["my_module.c"], include_dirs=[numpy.get_include()]), ], ) # Or, if you use cythonize() to make the ext_modules list, # include_dirs can be passed to setup() setup( ext_modules=cythonize("my_module.pyx"), include_dirs=[numpy.get_include()] )