Cython : "치명적인 오류 : numpy / arrayobject.h : 해당 파일 또는 디렉토리가 없습니다"


133

나는 대답을 가속화하기 위해 노력하고있어 여기 사이 썬를 사용하여. 코드를 컴파일하려고 시도 했지만 ( herecygwinccompiler.py 설명 된 핵 을 수행 한 후 ) 오류가 발생합니다. 누구나 내 코드에 문제가 있거나 Cython의 난해한 미묘한 부분이 있는지 말해 줄 수 있습니까?fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated

아래는 내 코드입니다.

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

사용중인 OS에 대한 태그를 추가 할 수 있습니까?
tacaswell

@tcaswell 64 비트 Windows 7
Noob Saibot

windows 태그를 추가했습니다. 창을 사용하는 방법을 아는 사람들 이이 문제를 볼 수 있기를 바랍니다.
tacaswell 2013

1
나는 이것을 발견 했다 . 일부 용어는 내 머리 위에 있지만 확인하겠습니다.
멍청한 놈 Saibot

답변:


186

당신에 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()]
)    

4
내가 왜 필요 np.import_array()할까요? Numpy C-API 는 그렇지 않습니까?
Noob Saibot

나는 당신의 아이디어를 시도했지만 이제는 여기에 게시하기에는 너무 긴이 미친 오류가 발생합니다.warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
Noob Saibot

아, 사실, 당신은 아마 필요하지 않습니다 np.import_array(). 그래도 numpy를 사용하는 Cython 확장은 거의 사용하지 않으므로 습관적으로 사용합니다. 다른 문제에 관해서는 인용 한 것은 오류가 아니라 경고 일뿐입니다. 수정해야 할 다른 오류가 있으면 새 게시물을 작성하십시오.
Robert Kern 2013

1
include_dirs=[numpy.get_include()]좋은 트릭 감사합니다!
Daniel Farrell

14
include_dirs에 전달 된 setup()최신의 distutils에서 무시됩니다, 각 전달해야합니다 Extension적어도 맥에
dashesy

45

귀하와 같은 단일 파일 프로젝트의 경우 다른 대안을 사용하는 것 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합니다.

출처 : http://wiki.cython.org/InstallingOnWindows


감사합니다, @SteveB. 그러나 " 당신과 같은 하나의 파일 프로젝트를 위해 ..." 라는 의미에 대해 좀 더 자세히 설명해 주 시겠습니까? 위의 모듈은 더 큰 응용 프로그램의 일부이지만 중요합니다. 어떻게 pyximport내 코드의 속도에 영향을? 마지막으로, 여기 섹션 : " Cython 0.11부터 pyximport 모듈에는 일반 Python 모듈에 대한 실험적인 컴파일 지원도 있습니다 ..." 는 여전히 문제가 있음을 암시합니다. 당신도 그것을 설명 할 수 있습니까?
Noob Saibot

1
"일반적인 파이썬 모듈에 대한 실험적인 컴파일 지원"– 위에서 제안한 코드를 사용하면 .py모듈은 cython이 아닌 정상적으로 컴파일되고 .pyx모듈은 cython으로 컴파일됩니다. 당신이 전달하는 경우 pyimport = Truepyximport.install(), 그것은 심지어 예를 들어, 모든 것을 사이 썬 사용 import random하거나 import os. 그 기능을 사용할 이유가없고 문제를 일으킬 수 있기 때문에이 기능을 사용하지 않는 것이 좋습니다. 아마도 주로 cython 개발자가 사용합니다.
Steve Byrnes

pyximport전혀 작동하지 않으면 다른 방법과 동일한 C 코드를 만듭니다. 시도해보십시오. 내가 컴파일 과정이 충분히 복잡 할 때, 외부 시스템 라이브러리에 대한 예를 들어, 링크, 당신은 그 pyximport을 찾을 수 있다는 사실을 언급했다가 실패하고 당신이 필요 setup.py하고 cythonize그것을 구축하는 방법을 정확히 지정할 수 있습니다. 그러나 .pyx모듈에 imports 또는 cimports가 있다고해서 컴파일 할 수 없다는 의미는 아닙니다 pyximport. 완전히 괜찮을 수도 있습니다.
Steve Byrnes

통찰력을 제공 할 수 있는 Cython 게시물 이 있습니다.
Phillip

14

이 오류는 컴파일하는 동안 numpy 헤더 파일을 찾을 수 없음을 의미합니다.

을 수행 export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/한 다음 컴파일하십시오. 이것은 몇 가지 다른 패키지의 문제입니다. 동일한 문제로 ArchLinux에 버그가 제기되었습니다. https://bugs.archlinux.org/task/22326


export라인을 어디에 추가 합니까? 내 setup.py파일에서?
Noob Saibot

아니요, 쉘 명령입니다. 쉘에서 실행 한 다음 컴파일을 시작하십시오.
John Brodie

셸 (@ 실행 위치 python setup.py) 의 @NoobSaibot이 export ..먼저 명령을 실행하십시오 . [pc] ython과 직접 관련이없는 쉘의 환경 변수를 설정합니다.
tacaswell

@ tcaswell : 나는 많이 생각했다. 나는 cmd를 사용하고 'export' is not recognized as an internal or external command, operable program or batch file.
있으며이

4
@NoobSaibot 당신은 창문 문제 같은 냄새에 대한 lunix 답변을 받고있다 ....
tacaswell

1

간단한 답변

보다 간단한 방법은 파일 경로를 추가하는 것 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

1

여기cythonize()언급 된대로 기능 내에서 수행 할 수 있어야 하지만 알려진 문제 가 있기 때문에 작동하지 않습니다.


1

설정 파일을 작성하고 include 디렉토리의 경로를 파악하기에 너무 게으른 경우 cyper를 시도 하십시오 . Cython 코드를 컴파일하고 설정할 수 있습니다include_dirs 하고 Numpy로 자동 .

코드를 문자열에로드 한 다음 간단히 실행 cymodule = cyper.inline(code_string)하면 함수를 cymodule.sparsemaker즉시 사용할 수 있습니다 . 이 같은

code = open(your_pyx_file).read()
cymodule = cyper.inline(code)

cymodule.sparsemaker(...)
# do what you want with your function

를 통해 cyper를 설치할 수 있습니다 pip install cyper.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.