Преобразование указателя C в массив Python numpy

#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. Спасибо. Этот подход решает мою проблему.