cython - เริ่มต้น 2d c-array

ฉันต้องการสร้างอาร์เรย์ 2 มิติภายในฟังก์ชัน cdef โดยมีจำนวนองค์ประกอบในแต่ละมิติ ขึ้นอยู่กับพารามิเตอร์ที่ส่งไปยังฟังก์ชัน เช่น.:

cdef int[:,:] c_volumecheck(int n):

    cdef:
        const int comb = 2**n
        const int nt = n
        int match[comb][nt] 
        size_t i,j

    # initialize values
    for i in range(comb):
        for j in range(n):
            match[i][j] = 0


return match

อย่างไรก็ตาม ดูเหมือนว่าการกำหนดให้กับ comb และ nt นิพจน์คงที่จะไม่ทำงาน เนื่องจากฉันได้รับข้อผิดพลาด "ไม่ได้รับอนุญาตในนิพจน์คงที่" ในบรรทัด int match[comb][nt] การระบุค่าที่เกี่ยวข้องด้วยตนเอง (match[8][3] สำหรับเช่น n=3) อย่างไรก็ตาม นั่นไม่ใช่ตัวเลือก เนื่องจากค่าเหล่านี้เปลี่ยนแปลงไปในระหว่างโปรแกรม

อย่างที่สองคือ ดูเหมือนว่าฉันไม่เข้าใจวิธีการส่งคืนอาร์เรย์นี้ไปยังฟังก์ชัน cdef หรือ def อื่นใน .pyx-script เดียวกัน: int[:,:] ดูเหมือนจะไม่สอดคล้องกับอาร์เรย์ 2 มิติเหมือนกับที่ฉันต้องการเริ่มต้น


person user3820991    schedule 05.06.2017    source แหล่งที่มา
comment
int[:,:] เป็นไวยากรณ์สำหรับ memoryview ที่พิมพ์ รหัสแนะนำให้อ่าน/ทดลองใช้หน้าเอกสารนี้: cython.readthedocs.io/ en/latest/src/userguide/memoryviews.html   -  person hpaulj    schedule 05.06.2017
comment
เชื่อฉันสิ ฉันไม่ขี้เกียจก่อนที่จะโพสต์คำถาม แต่ฉันไม่พบข้อมูลอ้างอิงเกี่ยวกับวิธีการส่งคืนอาร์เรย์ อย่างไรก็ตาม เมื่อปรึกษากับ c-turorials อาจเป็นกรณีที่ไม่ได้ตั้งใจ เพื่อให้สามารถส่งคืนอาร์เรย์ได้ เนื่องจากคุณไม่สามารถทำได้ในภาษา C เช่นกัน มีเพียงตัวชี้ไปยังอาร์เรย์เท่านั้น   -  person user3820991    schedule 05.06.2017
comment
คุณช่วยอธิบายได้ไหมว่าฟังก์ชั่นการโทรควรจะเห็นอะไร? นี่เป็นการดำเนินการระดับ C ล้วนๆ หรือคุณคาดว่าจะส่งคืนสิ่งที่มีประโยชน์ให้กับโค้ด Python (รายการ อาร์เรย์ numpy)   -  person hpaulj    schedule 05.06.2017
comment
มันควรจะกลับไปที่ฟังก์ชัน def ใน `pyx'-script ฉันอาจจะเก็บไว้ในสภาพแวดล้อม 'cdef' แต่ฉันจะไม่ใช้ค่าภายนอก Cython แน่นอน   -  person user3820991    schedule 06.06.2017
comment
นี่เป็นเพียงการเข้ารหัส c มาตรฐานซึ่งแก้ไขเล็กน้อยด้วยไวยากรณ์ cython หรือไม่   -  person hpaulj    schedule 06.06.2017
comment
ใช่นั่นคือสิ่งที่ฉันคิด   -  person user3820991    schedule 06.06.2017
comment
ซึ่งหมายความว่าคุณไม่สามารถส่งคืนอาร์เรย์หรือ memoryview ได้เนื่องจากอยู่ในระดับ C คุณสามารถส่งพอยน์เตอร์ไปรอบๆ ได้ คุณสามารถใช้การปรับโค้ดให้เหมาะสมบางส่วนได้โดยคงไว้เป็นฟังก์ชัน def และส่งคืนอาร์เรย์ NumPy สิ่งนี้จะดูแลการจัดสรรหน่วยความจำซึ่งเป็นผลพลอยได้ที่มีประโยชน์ สำหรับตัวอย่างของคุณ: cdef double[:,:] myarray = np.zeros((2**n, n)) จะแทนที่ส่วนการเริ่มต้นของฟังก์ชันของคุณ   -  person Pierre de Buyl    schedule 06.06.2017
comment
stackoverflow .com/questions/25917593/ แนะนำ memoryviews เป็นทางเลือกแทนอาร์เรย์ C แบบคงที่   -  person hpaulj    schedule 06.06.2017