2013-10-17 90 views
4

如此處所示How do I convert a Python list into a C array by using ctypes?此代碼將採用python數組並將其轉換爲C數組。如何使用ctypes將列表列表的Python列表轉換爲C數組?

import ctypes 
arr = (ctypes.c_int * len(pyarr))(*pyarr) 

哪一種方法可以對列表列表或列表列表進行相同操作?

例如,對於以下變量

list3d = [[[40.0, 1.2, 6.0, 0.3], [50.0, 4.2, 0, 0]], [[40.0, 1.2, 6.0, 0.3], [50.0, 4.2, 0, 0]], [[40.0, 1.2, 6.0, 0.3], [50.0, 4.2, 0, 0]]] 

我都試過,沒有運氣以下:

([[ctypes.c_double * 4] *2]*3)(*list3d) 
# *** TypeError: 'list' object is not callable 

(ctypes.c_double * 4 *2 *3)(*list3d) 
# *** TypeError: expected c_double_Array_4_Array_2 instance, got list 

謝謝!

編輯:只是爲了澄清,我想獲得一個對象,其中包含整個多維數組,而不是一個對象的列表。該對象的引用將是一個需要3D數組的C DLL的輸入。

+0

這不是一個很好的解決方案。對於列表a = [[1,2,3,4],[2,3,5,6]],您可以對鍵進行arr = [(ctypes.c_int * len(key))(* key) a] –

回答

2

works with tuples,如果你不介意先做了一些轉換:

from ctypes import * 

list3d = [ 
    [[0.0, 1.0, 2.0, 3.0], [4.0, 5.0, 6.0, 7.0]], 
    [[0.2, 1.2, 2.2, 3.2], [4.2, 5.2, 6.2, 7.2]], 
    [[0.4, 1.4, 2.4, 3.4], [4.4, 5.4, 6.4, 7.4]], 
] 

arr = (c_double * 4 * 2 * 3)(*(tuple(tuple(j) for j in i) for i in list3d)) 

檢查,它的行優先的順序正確初始化:

>>> (c_double * 24).from_buffer(arr)[:] 
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 
0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2, 
0.4, 1.4, 2.4, 3.4, 4.4, 5.4, 6.4, 7.4] 

或者你可以創建一個空數組並使用循環對其進行初始化。 enumeratelist的行和列和數據分配到切片:

arr = (c_double * 4 * 2 * 3)() 

for i, row in enumerate(list3d): 
    for j, col in enumerate(row): 
     arr[i][j][:] = col 
0

我所做的更改相應

a = [[[40.0, 1.2, 6.0, 0.3], [50.0, 4.2, 0, 0]], [[40.0, 1.2, 6.0, 0.3], [50.0, 4.2, 0, 0]], [[40.0, 1.2, 6.0, 0.3], [50.0, 4.2, 0, 0]]] 
arr = (((ctypes.c_float * len(a[0][0])) * len(a[0])) * len(a)) 
arr_instance=arr() 
for i in range(0,len(a)): 
    for j in range(0,len(a[0])): 
    for k in range(0,len(a[0][0])): 
     arr_instance[i][j][k]=a[i][j][k] 

arr_instance是你想要的。

+0

不幸的是,我正在尋找只有一個對象。我添加了額外的信息。不管怎麼說,還是要謝謝你! – pc05

+0

我編輯過。這將爲你做這項工作 –

+0

就是這樣!不過eryksun的答案更簡潔。謝謝 – pc05

相關問題