Cython: “error fatal: numpy / arrayobject.h: no existe tal archivo o directorio”

Estoy tratando de acelerar la respuesta aquí usando Cython. Intento comstackr el código (después de hacer el hackeo cygwinccompiler.py explicado aquí ), pero obtengo un fatal error: numpy/arrayobject.h: No such file or directory...comstacktion terminated error de fatal error: numpy/arrayobject.h: No such file or directory...comstacktion terminated . ¿Puede alguien decirme si es un problema con mi código o alguna sutileza esotérica con Cython?

A continuación se muestra mi código. Gracias por adelantado:

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

En su setup.py , la Extension debe tener el argumento include_dirs=[numpy.get_include()] .

Además, le falta np.import_array() en su código.

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

Para un proyecto de un archivo como el tuyo, otra alternativa es usar pyximport . No necesita crear un setup.py … ni siquiera necesita abrir una línea de comandos si usa IPython … todo es muy conveniente. En su caso, intente ejecutar estos comandos en IPython o en un script de 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(...) ... 

Puede que necesite editar el comstackdor por supuesto. Esto hace que la importación y la recarga funcionen igual para los archivos .pyx que para los archivos .py .

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

El error significa que no se encuentra un archivo de encabezado numpy durante la comstackción.

Intente export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/ , y luego compile. Este es un problema con algunos paquetes diferentes. Hay un error archivado en ArchLinux para el mismo problema: https://bugs.archlinux.org/task/22326

Respuesta simple

Una forma más sencilla es agregar la ruta a su archivo distutils.cfg . La ruta de acceso de Windows 7 es, por defecto, C:\Python27\Lib\distutils\ . Simplemente afirma los siguientes contenidos y debería funcionar:

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

Archivo de configuración completo

Para darle un ejemplo de cómo podría verse el archivo de configuración, mi archivo completo dice:

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