Estoy tratando de acelerar la respuesta aquí utilizando Cython. Voy a tratar de compilar el código (después de hacer el cygwinccompiler.py hack explicó aquí), pero consigue una fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated de error. ¿Alguien puede decirme si es un problema con mi código, o esotéricos sutileza con Cython?

A continuación es mi código. Gracias de antemano:

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()
se puede añadir una etiqueta a lo que OS está utilizando?
64-bit Windows 7.
añadido el windows etiqueta, ojalá que sirva para que este problema sea visto por personas que saben cómo utilizar windows (a diferencia de mí).
He encontrado este. Parte de la terminología que está por encima de mi cabeza, pero voy a comprobarlo.

OriginalEl autor Noob Saibot | 2013-02-02

4 Comentarios

  1. 139

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

    También, le falta np.import_array() en el 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()]
    )    
    ¿Por qué necesito np.import_array()? No es que por el Numpy C-API?
    Traté de tu idea, pero ahora me sale este loco de error que es demasiado largo para publicar aquí, pero comienza con warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
    Ah, cierto, probablemente no necesita np.import_array(). Rara vez escribo numpy-uso de Cython extensiones sin ella, aunque, por lo que yo lo uso como una cuestión de hábito. Como para el resto de su problema, lo que se cita es sólo una advertencia, no un error. Si usted tiene otros errores que hay que arreglar, por favor, hacer un nuevo post.
    include_dirs=[numpy.get_include()] es un buen truco gracias!
    include_dirs pasa a setup() se ignora en la última distutils, se pasa a cada Extension, al menos en mac

    OriginalEl autor Robert Kern

  2. 36

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

    Usted necesita editar el compilador de curso. Esto hace que la importación y la recarga de trabajo de la misma para .pyx archivos a medida que trabajan para .py archivos.

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

    Gracias, @SteveB. Pero ¿puede explicar un poco qué quiere decir con «Para un archivo de proyecto como el tuyo…»? El módulo de arriba es uno (aunque importante) parte de una aplicación más grande. ¿Cómo pyximport afectar mi código de velocidad? Y por último, el artículo aquí: «Desde Cython 0.11, el pyximport módulo también tiene experimental compilación de apoyo para el normal de los módulos de Python…» implica que todavía tiene algunos problemas de trabajo. ¿Puede explicar eso?
    Re «experimental compilación de apoyo para el normal de los módulos de Python» — con el código que he sugerido anteriormente, .py módulos compilados normalmente (no con cython), mientras que .pyx módulos compilados con cython. Si pasa pyimport = True en pyximport.install(), a continuación, utilizará cython por todo, incluso por ejemplo import random o import os. No sugiero el uso de esa característica, simplemente porque no hay ninguna razón convincente para el uso, y podría crear problemas. Probablemente es utilizado principalmente por cython los desarrolladores.
    Si pyximport funciona en todos, se creará exactamente el mismo código C como cualquier otro método. Así que pruébalo y verás. Me estaba refiriendo al hecho de que cuando el proceso de compilación es lo suficientemente complicado, por ejemplo, enlaces a bibliotecas de sistema, usted podría encontrar que pyximport falla y necesita un setup.py y cythonize para especificar exactamente cómo se construye. Pero el hecho de que su .pyx módulo tiene imports o cimports no significa que no puede ser compilado con pyximport; bien puede ser totalmente bien.
    Tengo un Cython post usted puede ser capaz de proporcionar una visión.

    OriginalEl autor Steve Byrnes

  3. 11

    El error significa que una colección de encabezado de archivo no se encuentra durante la compilación.

    Trate de hacer export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/, y luego de la compilación. Este es un problema con un par de paquetes diferentes. Hay un error presentado en ArchLinux para el mismo problema: https://bugs.archlinux.org/task/22326

    Donde puedo añadir la export línea? En mi setup.py archivo?
    No, es un comando de la shell. Ejecutar en el shell, a continuación, iniciar la compilación.
    Así que…en mi .pyx archivo?
    en el shell (donde se ejecuta el python setup.py) ejecutar el export .. comando en primer lugar. Establece las variables de entorno de la shell, no tiene nada que ver directamente con el [pc]ython.
    usted está consiguiendo lunix respuestas para lo que huele a un problema de windows….

    OriginalEl autor John Brodie

  4. 1

    Respuesta Simple

    Una manera más sencilla es añadir la ruta de acceso al archivo de distutils.cfg. Es la ruta de acceso nombre de Windows 7 por defecto C:\Python27\Lib\distutils\. Usted acaba de afirmar el siguiente contenido y se debe trabajar:

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

    Todo el archivo de configuración

    Para dar un ejemplo de cómo el archivo de configuración podría parecer, toda mi archivo se lee:

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

    OriginalEl autor strpeter

Dejar respuesta

Please enter your comment!
Please enter your name here