#python #arrays #c #numpy #ctypes
Вопрос:
Я новичок в C и ctypes в Python.
Мне нужно преобразовать указатель C в массив двойников в массив Python numpy.
У меня есть следующая отправная точка:
import ctypes
import numpy as np
arrayPy = np.array([[0, 1, 2], [3, 4, 5]])
out_c = arrayPy.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
Могу я спросить, как я могу эффективно преобразовать объект «out_c» в массив Python numpy?
Ответ №1:
Начальная точка неверна, так arrayPy
как представляет собой массив целых чисел. Установите значение dtype
для создания массива двойников:
import ctypes
import numpy as np
arrayPy = np.array([[0, 1, 2], [3, 4, 5]], dtype=ctypes.c_double)
out_c = arrayPy.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
print(out_c, out_c[:arrayPy.size])
Вывод-указатель C на double. Срезание указателя покажет данные, но вам нужно знать размер, чтобы не повторять дальше конца данных:
<__main__.LP_c_double object at 0x000001A2B758E3C0> [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
Мне нужно преобразовать указатель C в массив двойников в массив Python numpy.
Чтобы преобразовать этот указатель обратно в массив numpy, вы можете использовать следующее, если знаете его форму:
a = np.ctypeslib.as_array(out_c, shape=arrayPy.shape)
print(a)
Выход:
[[0. 1. 2.]
[3. 4. 5.]]
Комментарии:
1. Спасибо. Этот подход решает мою проблему.