Cython: Lỗi nghiêm trọng: numpy / Arrayobject.h: Không có tệp hoặc thư mục như vậy


133

Tôi đang cố gắng tăng tốc câu trả lời ở đây bằng Cython. Tôi cố gắng biên dịch mã (sau khi thực hiện cygwinccompiler.pyhack giải thích ở đây ), nhưng gặp fatal error: numpy/arrayobject.h: No such file or directory...compilation terminatedlỗi. Bất cứ ai có thể cho tôi biết nếu đó là một vấn đề với mã của tôi, hoặc một số tinh tế bí truyền với Cython?

Dưới đây là mã của tôi.

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

bạn có thể thêm một thẻ cho hệ điều hành bạn đang sử dụng?
tacaswell

@tcaswell Windows 64-bit 7.
Noob Saibot

đã thêm thẻ windows, hy vọng điều đó sẽ giúp vấn đề này được nhìn thấy bởi những người biết sử dụng windows (không giống như tôi).
tacaswell

1
Tôi tìm thấy này . Một số thuật ngữ ở trên đầu tôi, nhưng tôi sẽ kiểm tra nó.
Noob Saibot

Điều này có trả lời câu hỏi của bạn không? Làm cho distutils tìm kiếm các tệp tiêu đề numpy ở đúng vị trí
ead

Câu trả lời:


186

Trong của bạn setup.py, Extensionnên có đối số include_dirs=[numpy.get_include()].

Ngoài ra, bạn đang thiếu np.import_array()trong mã của bạn.

-

Ví dụ 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
Tại sao tôi cần np.import_array()? Đó không phải là cho C-API Numpy sao?
Noob Saibot

Tôi đã thử ý tưởng của bạn, nhưng bây giờ tôi nhận được lỗi điên rồ này quá lâu để đăng ở đây, nhưng nó bắt đầu bằngwarning: untitled.pyx:8:49: Buffer unpacking not optimized away.
Noob Saibot

À, đúng rồi, có lẽ bạn không cần np.import_array(). Tuy nhiên, tôi hiếm khi viết các tiện ích mở rộng Cython mà không có nó, vì vậy tôi sử dụng nó như một thói quen. Đối với vấn đề khác của bạn, những gì bạn trích dẫn chỉ là một cảnh báo, không phải là một lỗi. Nếu bạn có lỗi khác cần sửa, xin vui lòng tạo một bài mới.
Robert Kern

1
include_dirs=[numpy.get_include()]là một mẹo hay cảm ơn bạn!
Daniel Farrell

14
include_dirsđược thông qua để setup()bị bỏ qua trong các distutils mới nhất, nó phải được truyền cho từng người Extension, ít nhất là trên mac
dashy

45

Đối với một dự án một tệp như của bạn, một cách khác là sử dụng pyximport. Bạn không cần phải tạo setup.py... bạn thậm chí không cần mở một dòng lệnh nếu bạn sử dụng IPython ... tất cả đều rất thuận tiện. Trong trường hợp của bạn, hãy thử chạy các lệnh này trong IPython hoặc trong tập lệnh Python bình thường:

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

Bạn có thể cần phải chỉnh sửa trình biên dịch tất nhiên. Điều này làm cho việc nhập và tải lại hoạt động giống nhau đối với .pyxcác tệp khi chúng hoạt động đối với .pycác tệp.

Nguồn: http://wiki.cython.org/InstallingOnWindows


Cảm ơn, @SteveB. Nhưng bạn có thể giải thích một chút về ý của bạn bằng cách " Đối với một dự án một tệp như của bạn ..." không? Mô-đun trên là một phần (mặc dù quan trọng) của một ứng dụng lớn hơn. Làm thế nào để pyximportảnh hưởng đến tốc độ mã của tôi? Và cuối cùng, phần ở đây: " Kể từ Cython 0.11, mô-đun pyimumport cũng có hỗ trợ biên dịch thử nghiệm cho các mô-đun Python bình thường ..." ngụ ý rằng nó vẫn còn một số kink để giải quyết. Bạn có thể giải thích điều đó là tốt?
Noob Saibot

1
"Hỗ trợ biên dịch thử nghiệm cho các mô-đun Python bình thường" - với mã tôi đã đề xuất ở trên, .pycác mô-đun được biên dịch bình thường (không phải với cython) trong khi .pyxcác mô-đun được biên dịch bằng cython. Nếu bạn truyền pyimport = Truevào pyximport.install(), thì nó sẽ sử dụng cython cho mọi thứ, thậm chí là ví dụ import randomhoặc import os. Tôi không khuyên bạn nên sử dụng tính năng đó, đơn giản vì không có lý do thuyết phục để sử dụng nó và nó có thể tạo ra vấn đề. Nó có lẽ được sử dụng chủ yếu bởi các nhà phát triển cython.
Steve Byrnes

Nếu pyximporthoạt động hoàn toàn, nó sẽ tạo mã C chính xác như bất kỳ phương thức nào khác. Vì vậy, hãy thử nó và xem. Tôi đã đề cập đến thực tế là khi quá trình biên dịch đủ phức tạp, ví dụ như liên kết đến các thư viện hệ thống bên ngoài, bạn có thể thấy rằng pyimumport không thành công và bạn cần một setup.pycythonizechỉ định chính xác cách xây dựng nó. Nhưng thực tế là .pyxmô-đun của bạn có importhoặc cimportkhông có nghĩa là nó không thể được biên dịch pyximport; nó có thể hoàn toàn tốt
Steve Byrnes

Tôi có một bài viết Cython bạn có thể cung cấp cái nhìn sâu sắc về.
Phillip

14

Lỗi có nghĩa là tệp tiêu đề numpy không được tìm thấy trong quá trình biên dịch.

Hãy thử làm export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/, và sau đó biên dịch. Đây là một vấn đề với một vài gói khác nhau. Có một lỗi được gửi trong ArchLinux cho cùng một vấn đề: https://bugs.archlinux.org/task/2 2326


Tôi thêm exportdòng ở đâu? Trong setup.pytập tin của tôi ?
Noob Saibot

Không, đó là một lệnh shell. Chạy nó trong shell của bạn, sau đó bắt đầu biên dịch.
John Brodie

@NoobSaibot trong shell (nơi bạn chạy python setup.py) chạy export ..lệnh trước. Nó đặt các biến môi trường của shell, không phải bất cứ điều gì trực tiếp làm với [pc] ython.
tacaswell

@tcaswell: Tôi hình như nhiều. Tôi đang sử dụng cmd và đã 'export' is not recognized as an internal or external command, operable program or batch file.gặp lỗi này ... không thể chiến thắng với lỗi này ...
Noob Saibot 2/213

4
@NoobSaibot bạn đang nhận được câu trả lời của lunix cho những gì có mùi giống như vấn đề của cửa sổ ....
tacaswell

1

Câu trả lời đơn giản

Một cách đơn giản hơn là thêm đường dẫn vào tệp của bạn distutils.cfg. Theo mặc định, đường dẫn của Windows 7 là mặc định C:\Python27\Lib\distutils\. Bạn chỉ cần xác nhận các nội dung sau đây và nó sẽ hoạt động:

[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include

Toàn bộ tập tin cấu hình

Để cho bạn một ví dụ về cách tệp cấu hình có thể trông như thế nào, toàn bộ tệp của tôi đọc:

[build]
compiler = mingw32

[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
compiler = mingw32


1

Nếu bạn quá lười để viết các tập tin thiết lập và tìm ra đường dẫn cho các thư mục bao gồm, hãy thử cyper . Nó có thể biên dịch mã Cython của bạn và include_dirstự động đặt cho Numpy.

Tải mã của bạn vào một chuỗi, sau đó chỉ cần chạy cymodule = cyper.inline(code_string), sau đó chức năng của bạn có sẵn cymodule.sparsemakerngay lập tức. Một cái gì đó như thế này

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

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

Bạn có thể cài đặt cyper qua pip install cyper.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.