Cython:“致命错误:numpy / arrayobject.h:没有这样的文件或目录”

我正在使用Cython来加速这个答案。 我尝试编译代码(在这里解释cygwinccompiler.py hack之后),但得到一个fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated错误。 任何人都可以告诉我,如果这是我的代码有问题,或用Cython的一些深奥的微妙?

以下是我的代码。 提前致谢:

 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.pyExtension应该有include_dirs=[numpy.get_include()]

此外,您在代码中缺lessnp.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()] ) 

对于像你这样的单文件项目,另一种select是使用pyximport 。 你不需要创build一个setup.py ,如果你使用IPython,你甚至不需要打开一个命令行……这都非常方便。 在你的情况下,尝试在IPython或正常的Python脚本中运行这些命令:

 import numpy import pyximport pyximport.install(setup_args={"script_args":["--compiler=mingw32"], "include_dirs":numpy.get_include()}, reload_support=True) import my_pyx_module print my_pyx_module.some_function(...) ... 

当然你可能需要编辑编译器。 这使得导入和重新加载对.pyx文件的工作与对.py文件工作的工作相同。

来源: http : //wiki.cython.org/InstallingOnWindows

这个错误意味着在编译期间没有find一个numpy的头文件。

尝试export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/ ,然后编译。 这是几个不同的包的问题。 ArchLinux中存在一个同样的问题: https : //bugs.archlinux.org/task/22326

简单的答案

更简单的方法是将path添加到文件distutils.cfg 。 它代表Windows 7的默认path是C:\Python27\Lib\distutils\ 。 你只是断言以下内容,它应该工作:

 [build_ext] include_dirs= C:\Python27\Lib\site-packages\numpy\core\include 

整个configuration文件

为了给你一个例子configuration文件的样子,我的整个文件如下:

 [build] compiler = mingw32 [build_ext] include_dirs= C:\Python27\Lib\site-packages\numpy\core\include compiler = mingw32