Подтвердить что ты не робот

Cython: "фатальная ошибка: numpy/arrayobject.h: нет такого файла или каталога"

Я пытаюсь ускорить ответ здесь с помощью Cython. Я пытаюсь скомпилировать код (после выполнения cygwinccompiler.py hack объяснил здесь), но получите ошибку fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated. Может ли кто-нибудь сказать мне, если это проблема с моим кодом или какая-то эзотерическая тонкость с Cython?

Ниже мой код. Заранее спасибо:

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()
4b9b3361

Ответ 1

В вашем setup.py, Extension должен иметь аргумент include_dirs=[numpy.get_include()].

Кроме того, в вашем коде отсутствует np.import_array().

-

Пример 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()]
)    

Ответ 2

Для проекта с одним файлом, такого как ваш, другой альтернативой является использование pyximport. Вам не нужно создавать setup.py... вам не нужно даже открывать командную строку, если вы используете IPython... все это очень удобно. В вашем случае попробуйте запустить эти команды в IPython или в обычном Python script:

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

Возможно, вам потребуется отредактировать компилятор, конечно. Это делает импорт и перезагрузку одинаковыми для файлов .pyx, поскольку они работают для файлов .py.

Источник: http://wiki.cython.org/InstallingOnWindows

Ответ 3

Ошибка означает, что во время компиляции не создается файл заголовка numpy.

Попробуйте выполнить export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/, а затем выполните компиляцию. Это проблема с несколькими различными пакетами. Там была ошибка, зарегистрированная в ArchLinux для той же проблемы: https://bugs.archlinux.org/task/22326

Ответ 4

Простой ответ

Простым способом является добавление пути к вашему файлу distutils.cfg. Это путь от имени Windows 7 по умолчанию C:\Python27\Lib\distutils\. Вы просто утверждаете следующее содержание, и оно должно работать:

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

Весь файл конфигурации

Чтобы дать вам пример того, как может выглядеть файл конфигурации, весь мой файл читает:

[build]
compiler = mingw32

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

Ответ 5

Он должен быть в состоянии сделать это в функции cythonize(), как указано здесь, но это не работает, потому что есть известная проблема