cython - inisialisasi c-array 2d

Saya ingin membuat array 2D dalam fungsi cdef dengan jumlah elemen di setiap dimensi bergantung pada parameter yang diteruskan ke fungsi tersebut. Misalnya.:

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

Namun, menetapkan ekspresi konstan ke comb dan nt sepertinya tidak berfungsi karena saya mendapatkan kesalahan "Tidak diizinkan dalam ekspresi konstan" di baris int match[comb][nt]. Memberikan nilai masing-masing secara manual berfungsi (match[8][3] misalnya n=3). Namun hal ini bukanlah suatu pilihan, karena nilai-nilai ini berubah selama program berlangsung.

Hal kedua adalah, sepertinya saya tidak mengerti cara mengembalikan array ini ke fungsi cdef atau def lain dalam skrip .pyx yang sama: int[:,:] sepertinya tidak sesuai dengan array 2d seperti yang ingin saya inisialisasi.


person user3820991    schedule 05.06.2017    source sumber
comment
int[:,:] adalah sintaks untuk tampilan memori yang diketik; Saya sarankan membaca/bereksperimen dengan halaman dokumen ini: cython.readthedocs.io/ en/latest/src/userguide/memoryviews.html   -  person hpaulj    schedule 05.06.2017
comment
percayalah, saya tidak malas sebelum memposting pertanyaan saya. Tapi saya tidak bisa menemukan referensi tentang cara mengembalikan array. Namun, dengan melihat c-turorials, mungkin hal tersebut tidak dimaksudkan untuk dapat mengembalikan array, karena Anda juga tidak dapat melakukannya di C, hanya pointer ke array.   -  person user3820991    schedule 05.06.2017
comment
Bisakah Anda menjelaskan apa yang seharusnya dilihat oleh fungsi panggilan? Apakah ini murni operasi tingkat C, atau apakah Anda berharap mengembalikan sesuatu yang berguna ke kode Python (daftar, array numpy)?   -  person hpaulj    schedule 05.06.2017
comment
itu seharusnya kembali ke fungsi def di skrip `pyx'. Saya mungkin bisa menyimpannya dalam lingkungan 'cdef'. Tapi saya pasti tidak akan menggunakan nilai di luar cython.   -  person user3820991    schedule 06.06.2017
comment
Lalu apakah ini hanya pengkodean c standar, dimodifikasi sedikit dengan sintaks cython?   -  person hpaulj    schedule 06.06.2017
comment
ya, itulah yang saya pikirkan.   -  person user3820991    schedule 06.06.2017
comment
Artinya Anda tidak dapat mengembalikan array atau tampilan memori, karena berada di level C. Namun Anda dapat memberikan petunjuk. Anda dapat menggunakan optimalkan kode Anda sebagian dengan menyimpannya sebagai fungsi def dan mengembalikan array NumPy. Ini akan menangani alokasi memori, produk sampingan yang berguna. Sebagai contoh Anda: cdef double[:,:] myarray = np.zeros((2**n, n)) akan menggantikan bagian inisialisasi fungsi Anda.   -  person Pierre de Buyl    schedule 06.06.2017
comment
stackoverflow .com/questions/25917593/ menyarankan tampilan memori sebagai alternatif dari array C statis.   -  person hpaulj    schedule 06.06.2017