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

2019-07-19 03:57发布

我试图加快答案在这里使用用Cython。 我尝试编译代码(做后cygwinccompiler.py黑客解释这里 ),却得到了一个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()

Answer 1:

在你的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()]
)    


Answer 2:

对于像你这样的一个文件的项目,另一种选择是使用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文件。

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



Answer 3:

该错误意味着一个numpy的头文件不被编译过程中发现的。

试着做export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/ ,然后编译。 这是几个不同的包有问题。 有一个在ArchLinux的申请同一个问题的错误: https://bugs.archlinux.org/task/22326



Answer 4:

答案很简单

一种方法更简单的方法是将路径添加到您的文件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


文章来源: Cython: “fatal error: numpy/arrayobject.h: No such file or directory”