Как использовать массив NumPy с ctypes? - PullRequest
9 голосов
/ 07 июля 2010

Я все еще пишу на интерфейсе Python для моего кода c с ctypes.Сегодня я заменил свою функцию чтения файлов версией на python, которая была запрограммирована кем-то еще, например, NumPy.«Старая» версия c была вызвана с помощью byref (p_data), а p_data = PFloat () (см. Ниже).Основная функция принимает p_data.

Чтение старого файла:

p_data=POINTER(c_float)
foo.read(filename,byref(p_data))
result=foo.pymain(p_data)

Функция чтения файла python, с другой стороны, возвращает массив NumPy.Мой вопрос сейчас:

Как мне преобразовать массив NumPy в POINTER (c_float)?

Я гуглил, но нашел только наоборот: C-массивы через ctypes, к которым обращаются как NumPyмассивы и вещи, которые я не понимал: Интерфейс внешних функций C-типов (numpy.ctypeslib)

[обновление] исправил ошибку в примерекод

1 Ответ

19 голосов
/ 09 сентября 2010

Ваш код выглядит так, будто в нем есть некоторая путаница - ctypes.POINTER() создает новый указатель ctypes class , а не экземпляр ctypes.В любом случае, самый простой способ передать массив NumPy в код ctypes - использовать метод data_as numpy.ndarray атрибута *1004*.Просто убедитесь, что базовые данные верного типа.Например:

c_float_p = ctypes.POINTER(ctypes.c_float)
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]])
data = data.astype(numpy.float32)
data_p = data.ctypes.data_as(c_float_p)
...