问题:Cython:“严重错误:numpy / arrayobject.h:没有此类文件或目录”
我试图加快答案在这里使用用Cython。我尝试编译代码(在完成此处cygwinccompiler.py
介绍的hack 之后),但出现错误。谁能告诉我我的代码是否有问题,或者Cython有点神秘?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()
回答 0
在你里面setup.py
,Extension
应该有论据include_dirs=[numpy.get_include()]
。
另外,您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()]
)
回答 1
对于像您这样的单文件项目,另一种选择是使用pyximport
。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
。
回答 2
该错误意味着在编译过程中找不到numpy头文件。
尝试这样做export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/
,然后进行编译。这是几个不同软件包的问题。在ArchLinux中,存在针对同一问题的错误: https //bugs.archlinux.org/task/22326
回答 3
简单的答案
一种更简单的方法是将路径添加到文件中distutils.cfg
。默认情况下,它代表Windows 7的路径C:\Python27\Lib\distutils\
。您只需声明以下内容即可解决:
[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
整个配置文件
为了给您一个示例,配置文件的外观,我的整个文件显示为:
[build]
compiler = mingw32
[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
compiler = mingw32
回答 4
回答 5
如果您懒得编写设置文件并弄清楚包含目录的路径,请尝试cyper。它可以编译您的Cython代码并进行设置include_dirs
自动为Numpy。
将您的代码加载到字符串中,然后简单地运行cymodule = cyper.inline(code_string)
,然后您的函数cymodule.sparsemaker
即刻可用。像这样
code = open(your_pyx_file).read()
cymodule = cyper.inline(code)
cymodule.sparsemaker(...)
# do what you want with your function
您可以通过安装cyper pip install cyper
。