Cython:“严重错误:numpy / arrayobject.h:没有此类文件或目录”


133

我试图加快答案在这里使用用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()

您可以为正在使用的操作系统添加标签吗?
tacaswell

@tcaswell 64位Windows 7
菜鸟Saibot

添加了Windows标记,希望这将有助于那些知道如何使用Windows的人(与我不同)看到此问题。
tacaswell

1
我发现了这个。有些术语是我无法理解的,但我要检查一下。
Noob Saibot

这回答了你的问题了吗?使distutils在正确的位置查找numpy头文件
ead

Answers:


185

在你里面setup.pyExtension应该有论据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()]
)    

4
我为什么需要np.import_array()?那不是Numpy C-API吗?
Noob Saibot

我尝试了您的想法,但现在我收到了一个疯狂的错误,错误消息已久,无法在此处发布,但它始于warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
Noob Saibot

啊,是的,您可能不需要np.import_array()。但是,我很少编写不使用numpy的Cython扩展,因此我习惯使用它。至于您的其他问题,您引用的只是警告,而不是错误。如果您还有其他错误需要修复,请发布新帖子。
罗伯特·科恩

1
include_dirs=[numpy.get_include()]是一个很好的技巧,谢谢!
Daniel Farrell 2013年

14
include_dirs传递到setup()最新的distutils中被忽略Extension,至少在mac上,它必须传递给每个
破旧的

45

对于像您这样的单文件项目,另一种选择是使用pyximportsetup.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


谢谢@SteveB。但是,您能否详细说明“ 对于像您这样的单文件项目 ...”的意思是什么?上面的模块是大型应用程序的一部分(尽管很重要)。如何pyximport影响我的代码速度?最后是此处的部分:自Cython 0.11起,pyximport模块还具有对普通Python模块的实验性编译支持 ……”表明它仍有一些缺点。您能解释一下吗?
Noob Saibot

1
关于“对普通Python模块的实验性编译支持”-使用上面我建议的代码,.py模块正常编译(不使用cython),而.pyx模块使用cython编译。如果传递pyimport = Truepyximport.install(),那么它会用用Cython的一切,即使例如import randomimport os。我不建议使用该功能,只是因为没有令人信服的理由使用它,否则可能会造成问题。cython开发人员可能主要使用它。
史蒂夫·伯恩斯

如果pyximport可以的话,它将创建与任何其他方法完全相同的C代码。因此,请尝试看看。我指的是这样的事实:当编译过程非常复杂时,例如,到外部系统库的链接,您可能会发现pyximport失败,并且需要一个setup.pycythonize来确切指定如何构建它。但是您的.pyx模块具有imports或cimports的事实并不意味着它不能使用pyximport; 编译。这可能完全没问题。
史蒂夫·伯恩斯

我有一条Cython帖子,您也许可以提供您的见解。
菲利普

14

该错误意味着在编译过程中找不到numpy头文件。

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


我在哪里添加export线?在我的setup.py档案中?
Noob Saibot

不,这是一个shell命令。在您的Shell中运行它,然后开始编译。
约翰·布罗迪

外壳程序(在其中运行python setup.py)中的@NoobSaibot export ..首先运行命令。它设置了外壳的环境变量,而与[pc] ython无关。
tacaswell

@tcaswell:我想了很多。我正在使用cmd,但遇到此'export' is not recognized as an internal or external command, operable program or batch file.错误...用这个命令无法赢取...
Noob Saibot 2013年

4
@ NoobSaibot您正在得到关于气味的窗户问题的lunix答案...
tacaswell

1

简单的答案

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


1

如果您懒得编写设置文件并弄清楚包含目录的路径,请尝试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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.