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.py
, Extension
应该有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