Как использовать массив NumPy с ctypes?

Я все еще пишу на интерфейсе 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)?

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

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

  • Получение данных из массива ctypes в numpy
  • Предупреждение PEP 3118 при использовании массива ctypes в виде массива numpy
  • Невозможно импортировать Numpy в Python
  • Как получить доступ к массивам, переданным в ctypes callbacks в виде массивов numpy?
  • One Solution collect form web for “Как использовать массив NumPy с ctypes?”

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

     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) 
    Python - лучший язык программирования в мире.