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