1

入力として 1D numpy 配列を受け入れ、出力として 1D numpy 配列を返す単純な cython ルーチンを最適化しようとしています。

私は単純なバージョンを動作させており、現在、cython コードの numpy 部分に対していくつかの標準的な最適化を試みています。

ただし、cimport numpycython ソース ファイルに追加するとすぐに、拡張モジュールを実行できず (コンパイルは正常に行われますが) ValueError: numpy.dtype does not appear to be the correct type object、.

私のnumpyバージョンは1.6.0で、pythonバージョンは2.6.5です(デフォルト、Ubuntu 10.04 apt-getインストール)

問題の原因となる最小限の例:


test_ext.pyx

import numpy as np
cimport numpy as np #Commenting this line un-breaks the extension

def test_ext(refls, str mode, int nguard, int nblock):

    cdef int i
    cdef int _len = refls.shape[0]
    _out = np.zeros([_len])

    for i in range(_len):
        _out[i] = refls[i] + 1
    return _out

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("test_ext", ["test_ext.pyx"])]

setup(
    name = 'test',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

run_ext.py

import numpy
from test_ext import test_ext

a = np.array([x for x in range(260)])
_res = test_ext.test_ext(a, 'avg', 2, 3)

ビルド:

python setup.py build_ext --inplace

私のビルド出力:

running build_ext
cythoning my_ext.pyx to my_ext.c
building 'my_ext' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.6 -c my_ext.c -o build/temp.linux-x86_64-2.6/my_ext.o
/usr/include/python2.6/numpy/__multiarray_api.h:968: warning: ‘_import_array’ defined but not used
my_ext.c:732: warning: ‘__pyx_k_3’ defined but not used
my_ext.c:733: warning: ‘__pyx_k_4’ defined but not used
my_ext.c:753: warning: ‘__pyx_k_24’ defined but not used
my_ext.c:759: warning: ‘__pyx_k_26’ defined but not used
my_ext.c:760: warning: ‘__pyx_k_27’ defined but not used
my_ext.c:1118: warning: ‘__pyx_pf_5numpy_7ndarray___getbuffer__’ defined but not used
my_ext.c:1876: warning: ‘__pyx_pf_5numpy_7ndarray___releasebuffer__’ defined but not used
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.6/my_ext.o -o /home/path/to/my_ext.so

そして実行しrun_ext.pyます。

cimport行のコメントを外すと、次のエラーが表示されます。

Traceback (most recent call last):
  File "run_ext.py", line 2, in <module>
    from test_ext import test_ext
  File "numpy.pxd", line 43, in test_ext (test_ext.c:2788)
ValueError: numpy.dtype does not appear to be the correct type object

この原因と、拡張機能の最適化を継続するために修正するにはどうすればよいですか? 上記のリンクに従って最適化を続行しようとしましたが、どれだけ進んでも、この問題を解決するものは何もありません。

python/numpy のバージョンに問題があるこの問題を抱えている他の人を見たことがありますが、私にはそうではないと思います (私はそこに提案を受け入れますが)。任意の提案をいただければ幸いです。

4

1 に答える 1

3

numpy インクルード ファイルをインクルードするために必要なビルド ファイルのように見えます。setup.py を以下のものに変更すると、すべてが修正されました。

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy   # << New line

ext_modules = [Extension("test_ext", ["test_ext.pyx"])]

setup(
    name = 'test',
    cmdclass = {'build_ext': build_ext},
    include_dirs = [numpy.get_include()], # << New line
    ext_modules = ext_modules
)
于 2012-10-24T02:07:36.697 に答える