web-dev-qa-db-ja.com

Cython: "致命的なエラー:numpy / arrayobject.h:そのようなファイルまたはディレクトリはありません"

Cythonを使用して、答えを高速化しようとしています here 。私はコードをコンパイルしようとしました(cygwinccompiler.pyハックの説明 here )が、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()
113
Noob Saibot

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()]
)    
160
Robert Kern

あなたのような1ファイルのプロジェクトの場合、別の代替手段は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

40
Steve Byrnes

このエラーは、コンパイル中にnumpyヘッダーファイルが見つからないことを意味します。

export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/を実行してから、コンパイルしてみてください。これは、いくつかの異なるパッケージの問題です。同じ問題に関してArchLinuxにバグが報告されています: https://bugs.archlinux.org/task/22326

11
John Brodie

簡単な答え

より簡単な方法は、ファイルにパスを追加することです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
strpeter