Cython:“ ข้อผิดพลาดร้ายแรง: numpy / arrayobject.h: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว”


134

ฉันพยายามเร่งคำตอบที่นี่โดยใช้ Cython ฉันพยายามรวบรวมรหัส (หลังจากทำการcygwinccompiler.pyแฮ็คอธิบายที่นี่ ) แต่ได้รับ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()

คุณสามารถเพิ่มแท็กสำหรับระบบปฏิบัติการที่คุณใช้อยู่ได้ไหม
tacaswell

@tcaswell 64-bit Windows 7
Noob Saibot

เพิ่มแท็ก windows หวังว่าจะช่วยให้ผู้ที่รู้วิธีใช้ windows เห็นปัญหานี้ (ไม่เหมือนฉัน)
tacaswell

1
ฉันพบนี้ คำศัพท์บางคำอยู่เหนือหัวของฉัน แต่ฉันจะลองดู
Noob Saibot

คำตอบ:


188

ในของคุณsetup.pyที่ควรจะมีการโต้แย้งExtensioninclude_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()อ่าจริงคุณอาจไม่จำเป็นต้อง ฉันไม่ค่อยเขียนส่วนขยาย Cython ที่ใช้ตัวเลขโดยไม่ใช้มันดังนั้นฉันจึงใช้มันให้เป็นนิสัย สำหรับปัญหาอื่น ๆ ของคุณสิ่งที่คุณยกมาเป็นเพียงคำเตือนไม่ใช่ข้อผิดพลาด หากคุณมีข้อผิดพลาดอื่น ๆ ที่ต้องแก้ไขโปรดตั้งกระทู้ใหม่
Robert Kern

1
include_dirs=[numpy.get_include()]เป็นเคล็ดลับที่ดีขอบคุณ!
Daniel Farrell

14
include_dirsผ่านไปเพื่อsetup()ไม่สนใจในระยะทางล่าสุดจะต้องส่งต่อไปยังแต่ละรายการExtensionอย่างน้อยบน mac
ขีดกลาง

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
Re "การสนับสนุนการคอมไพล์การทดลองสำหรับโมดูล Python ปกติ" - ด้วยรหัสที่ฉันแนะนำไว้ข้างต้น.pyโมดูลจะถูกคอมไพล์ตามปกติ (ไม่ใช่ด้วย cython) ในขณะที่.pyxโมดูลถูกคอมไพล์ด้วย cython หากคุณผ่านpyimport = Trueเข้าไปpyximport.install()ก็จะใช้ cython สำหรับทุกอย่างแม้กระทั่งตัวอย่างเช่นimport randomหรือimport os. ฉันไม่แนะนำให้ใช้คุณสมบัตินั้นเพียงเพราะไม่มีเหตุผลที่น่าสนใจที่จะใช้มันและอาจสร้างปัญหาได้ ผู้พัฒนา Cython อาจใช้เป็นหลัก
Steve Byrnes

หากใช้pyximportงานได้ทั้งหมดก็จะสร้างรหัส C เหมือนกับวิธีอื่น ๆ ดังนั้นลองดู ฉันอ้างถึงข้อเท็จจริงที่ว่าเมื่อกระบวนการคอมไพล์มีความซับซ้อนเพียงพอเช่นลิงก์ไปยังไลบรารีระบบภายนอกคุณอาจพบว่า pyximport ล้มเหลวและคุณต้องมีsetup.pyและcythonizeระบุวิธีการสร้างอย่างชัดเจน แต่การที่.pyxโมดูลของคุณมีimports หรือcimports ไม่ได้หมายความว่าจะไม่สามารถคอมไพล์ด้วยpyximport; มันอาจจะดีทั้งหมด
Steve Byrnes

ฉันมีโพสต์ Cython ที่คุณสามารถให้ข้อมูลเชิงลึกได้
Phillip

14

ข้อผิดพลาดหมายความว่าไม่พบไฟล์ส่วนหัวที่เป็นตัวเลขระหว่างการคอมไพล์

ลองทำ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

@NoobSaibot ในเชลล์ (ที่คุณรันpython setup.py) รันexport ..คำสั่งก่อน มันตั้งค่าตัวแปรสภาพแวดล้อมของเชลล์ไม่ใช่อะไรที่เกี่ยวข้องโดยตรงกับ [pc] ython
tacaswell

@tcaswell: ฉันคิดเท่า ฉันใช้ cmd และได้รับ'export' is not recognized as an internal or external command, operable program or batch file.ข้อผิดพลาดนี้... ไม่สามารถชนะกับอันนี้ได้ ...
Noob Saibot

4
@NoobSaibot คุณกำลังได้รับคำตอบสำหรับสิ่งที่มีกลิ่นเหมือนปัญหา windows ....
tacaswell

1

คำตอบง่ายๆ

distutils.cfgวิธีวิธีที่ง่ายคือการเพิ่มเส้นทางไปยังไฟล์ของคุณ นามเส้นทางมันของ Windows 7 C:\Python27\Lib\distutils\โดยค่าเริ่มต้น คุณเพียงแค่ยืนยันเนื้อหาต่อไปนี้และควรได้ผล:

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

ไฟล์ config ทั้งหมด

เพื่อให้คุณเห็นตัวอย่างว่าไฟล์ config จะเป็นอย่างไรไฟล์ทั้งหมดของฉันอ่าน:

[build]
compiler = mingw32

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


1

ถ้าคุณขี้เกียจเกินไปที่จะเขียนแฟ้มการติดตั้งและคิดออกเส้นทางสำหรับรวมไดเรกทอรีลอง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

คุณสามารถติดตั้งไซเปอร์ผ่านpip install cyper.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.