4

ここに見られるように ctypes を使用して Python リストを C 配列に変換するにはどうすればよいですか? このコードは 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

ありがとうございました!

編集: 明確にするために、オブジェクトのリストではなく、多次元配列全体を含む 1 つのオブジェクトを取得しようとしています。このオブジェクトの参照は、3D 配列を期待する C DLL への入力になります。

4

2 に答える 2

2

最初に少し変換を行うことを気にしない場合は、タプルで機能します。

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]

または、空の配列を作成し、ループを使用して初期化することもできます。enumerateの行と列をlist調べて、データをスライスに割り当てます。

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

for i, row in enumerate(list3d):
    for j, col in enumerate(row):
        arr[i][j][:] = col
于 2013-10-17T21:58:48.240 に答える