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


133

Cythonを使用して、ここで答えを高速化しようとしています。(ここでcygwinccompiler.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 2013

@tcaswell 64ビットWindows 7
Noobサイボット

windowsタグを追加しました。うまくいけば、(私とは異なり)windowsの使い方を知っている人がこの問題を理解するのに役立ちます。
tacaswell 2013

1
私はこれを見つけまし。一部の用語は頭上にありますが、確認します。
Noobサイボット、2013

回答:


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 2013

私はあなたのアイデアを試しましたが、今ここに投稿するには長すぎるこのクレイジーなエラーが発生しましたが、それは次のように始まりますwarning: untitled.pyx:8:49: Buffer unpacking not optimized away.
Noob Saibot

ああ、そうです、おそらく必要ありませんnp.import_array()。ただし、numpyを使用するCython拡張機能を使用せずに作成することはめったにないので、習慣として使用します。他の問題については、あなたが引用したのは単なる警告であり、エラーではありません。修正が必要な他のエラーがある場合は、新しい投稿を作成してください。
Robert Kern

1
include_dirs=[numpy.get_include()]素敵なトリックですありがとうございます!
ダニエルファレル

14
include_dirsに渡されるsetup()最新のdistutilsで無視されます。Extension少なくともMacでは、それぞれに渡される必要があります
ダッシュ

45

あなたのような1ファイルのプロジェクトの場合、別の方法はを使用することpyximportです。setup.pyIPythonを使用すれば、作成する必要はありません...コマンドラインを開く必要すらありません...とても便利です。あなたの場合、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。しかし、「あなたのような1ファイルプロジェクトの場合 ...」とはどういう意味ですか?上記のモジュールは、(重要ではありますが)より大きなアプリケーションの一部です。pyximportコードの速度にどのように影響しますか?そして最後に、ここのセクション:Cython 0.11以降、pyximportモジュールは通常のPythonモジュールの実験的なコンパイルサポートも備えています ...」ということは、まだうまくいくいくつかのねじれがあることを意味します。それも説明できますか?
Noobサイボット2013

1
「通常のPythonモジュールの実験的なコンパイルサポート」について-上記で提案したコードを使用すると、.pyモジュールはCythonではなく通常どおりにコンパイルされ、モジュールは.pyxCythonでコンパイルされます。あなたは合格した場合pyimport = Truepyximport.install()、それはでも、たとえば、すべてのためにcythonを使用しますimport randomimport os。この機能を使用することはお勧めしません。それを使用する説得力のある理由がなく、問題が発生する可能性があるからです。おそらく、主にCython開発者によって使用されています。
Steve Byrnes、2013

pyximportまったく機能する場合は、他のメソッドとまったく同じCコードを作成します。試してみてください。私は、コンパイル処理は外部のシステムライブラリに十分に複雑、例えばリンクであるとき、あなたはpyximportが失敗し、あなたが必要なことを見つけるかもしれないという事実に言及していたsetup.pyし、cythonizeそれを構築する方法を正確に指定します。ただし、.pyxモジュールにimportsまたはcimportsがあるということは、それをでコンパイルできないことを意味しませんpyximport。まったく問題ないかもしれません。
Steve Byrnes、2013

私はあなたが洞察を提供できるかもしれない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 2013

いいえ、それはシェルコマンドです。シェルで実行してから、コンパイルを開始します。
John Brodie、2013

シェル(実行場所python setup.py)の@NoobSaibotがexport ..最初にコマンドを実行します。シェルの環境変数を設定します。[pc] ythonとは直接関係ありません。
tacaswell 2013

@tcaswell:私は同じくらい考えました。私はcmdを使用してい'export' is not recognized as an internal or external command, operable program or batch file.ますが、このエラーが発生しました... これでは勝てません...
Noob Saibot

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

セットアップファイルを作成するのが面倒で、インクルードディレクトリのパスがわからない場合は、cyperを試してください。Cythonコードをコンパイルし、include_dirsNumpyに自動的に設定できます。

コードを文字列にロードし、を実行するだけで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.