189 votes

Cython : "erreur fatale : numpy/arrayobject.h : No such file or directory"

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

Voici mon code.

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 votes

Pouvez-vous ajouter une balise pour indiquer le système d'exploitation que vous utilisez ?

0 votes

@tcaswell Windows 7 64-bit.

0 votes

J'ai ajouté le tag Windows, en espérant que cela aidera ce problème à être vu par les personnes qui savent utiliser Windows (contrairement à moi).

269voto

Robert Kern Points 4058

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

De plus, il vous manque 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()]
)

53voto

Steve B Points 566

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 même pas 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 dans 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 devrez peut-être modifier le compilateur, bien sûr. Cela fait que l'importation et le rechargement fonctionnent de la même manière pour .pyx comme ils le font pour .py des fichiers.

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

21voto

John Brodie Points 992

L'erreur signifie qu'un fichier d'en-tête numpy n'a pas été trouvé pendant la compilation.

Essayez de faire export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/ et ensuite la compilation. C'est un problème avec quelques paquets différents. Il y a un bogue enregistré dans ArchLinux pour le même problème : https://bugs.archlinux.org/task/22326

4voto

user128285 Points 101

Conformément à cette réponse si vous avez installé numpy con pip sous Linux, vous devrez définir manuellement un lien symbolique vers /usr/include/numpy

Dans mon cas, le chemin est le suivant :

sudo ln -s /usr/local/lib/python3.8/dist-packages/numpy/core/include/numpy/ /usr/include/numpy

3voto

Sub Struct Points 151

Si vous êtes trop paresseux pour écrire des fichiers d'installation et déterminer le chemin des répertoires d'inclusion, essayez cyprès . Il peut compiler votre code Cython et définir include_dirs pour Numpy automatiquement.

Chargez votre code dans une chaîne, puis exécutez simplement cymodule = cyper.inline(code_string) alors votre fonction est disponible en tant que cymodule.sparsemaker instantanément. Quelque chose comme ceci

code = open(your_pyx_file).read()
cymodule = cyper.inline(code)

cymodule.sparsemaker(...)
# do what you want with your function

Vous pouvez installer cyper via pip install cyper .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X