Cython: "фатальная ошибка: numpy/arrayobject.ч: нет такого файла или каталога"
Я пытаюсь ускорить ответ здесь, используя Cython. Я пытаюсь скомпилировать код (после cygwinccompiler.py
Кайло, объяснил здесь), но получить 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()
4 ответа:
в своем
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()] )
для проекта с одним файлом, как у вас, другой альтернативой является использование
pyximport
. Вам не нужно создаватьsetup.py
... вам даже не нужно открывать командную строку, если вы используете IPython ... это все очень удобно. В вашем случае попробуйте выполнить эти команды в IPython или в обычном скрипте 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(...) ...
возможно, Вам придется изменить компилятор, конечно. Это делает импорт и перезагрузка работают одинаково для
.pyx
файлы, как они работают.py
файлы.
ошибка означает, что файл заголовка numpy не найден во время компиляции.
попробуйте
export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/
, и после компиляции. Это проблема с несколькими различными пакетами. Есть ошибка, поданная в ArchLinux для той же проблемы:https://bugs.archlinux.org/task/22326
простой ответ
более простой способ-добавить путь к вашему файлу
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