Cython: "fatal error: numpy/arrayobject.h: Aucun fichier ou répertoire"

j'essaie d'accélérer la réponse ici en utilisant Cython. J'essaie de compiler le code (après avoir fait le cygwinccompiler.py Hack expliqué ici ), mais obtenir une erreur fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated . Quelqu'un peut-il me dire si c'est un problème avec mon code, ou une subtilité ésotérique avec Cython?

ci-dessous est mon code. Merci d'avance:

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()
93
demandé sur Community 2013-02-02 04:38:35

4 réponses

dans votre setup.py , le Extension devrait avoir l'argument include_dirs=[numpy.get_include()] .

il vous manque aussi np.import_array() dans votre code.

--

exemple 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()]
)    
134
répondu Robert Kern 2014-10-26 15:54:01

pour un projet à un seul fichier comme le vôtre, une autre alternative est d'utiliser pyximport . Vous n'avez pas besoin de créer un setup.py ... vous n'avez pas même besoin d'ouvrir une ligne de commande si vous utilisez IPython ... c'est très pratique. Dans votre cas, essayez D'exécuter ces commandes en IPython ou dans un script Python normal:

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(...)
...

vous pourriez avoir besoin d'éditer le compilateur bien sûr. Cela rend l'importation et le rechargement de travail le même pour .pyx fichiers comme ils travaillent pour .py fichier.

Source: http://wiki.cython.org/InstallingOnWindows

35
répondu Steve Byrnes 2013-02-03 23:24:34

l'erreur signifie qu'un fichier d'en-tête numpy n'est pas trouvé lors de la compilation.

essayez de faire export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/ , puis compilez. C'est un problème avec quelques paquets différents. Il y a un bug déposé à ArchLinux pour le même numéro: https://bugs.archlinux.org/task/22326

11
répondu John Brodie 2013-02-02 00:46:54

réponse Simple

une façon plus simple est d'ajouter le chemin à votre fichier distutils.cfg . Son chemin d'accès pour Windows 7 est par défaut C:\Python27\Lib\distutils\ . Vous venez d'affirmer les contenus suivants et cela devrait fonctionner:

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

fichier de configuration complet

pour vous donner un exemple de comment le fichier de configuration pourrait ressembler, mon fichier entier se lit:

[build]
compiler = mingw32

[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
compiler = mingw32
1
répondu strpeter 2015-04-14 12:42:15