Создание массивов NumPy из объекта указателя ctypes является проблематичной операцией.Неясно, кому на самом деле принадлежит память, на которую указывает указатель.Когда он снова будет освобожден?Как долго это действует?По возможности я старался избегать такого рода конструкции.Гораздо проще и безопаснее создавать массивы в коде Python и передавать их в функцию C, чем использовать память, выделенную не зависящей от Python функцией C.Выполняя последнее, вы в некоторой степени сводите на нет преимущества наличия языка высокого уровня, обеспечивающего управление памятью.
Если вы действительно уверены, что кто-то заботится о памяти, вы можете создать объектразоблачение Python «буферный протокол», а затем создать массив NumPy, используя этот объект буфера.Вы дали один способ создания объекта буфера в своем посте через недокументированную функцию int_asbuffer()
:
buffer = numpy.core.multiarray.int_asbuffer(
ctypes.addressof(y.contents), 8*array_length)
(Обратите внимание, что я заменил 8
на np.dtype(float).itemsize
. Это всегда 8 на любой платформе.) Другой способ создания объекта буфера - вызвать функцию PyBuffer_FromMemory()
из Python C API через ctypes:
buffer_from_memory = ctypes.pythonapi.PyBuffer_FromMemory
buffer_from_memory.restype = ctypes.py_object
buffer = buffer_from_memory(y, 8*array_length)
Для обоих этих способов вы можете создать массив NumPy из buffer
by
a = numpy.frombuffer(buffer, float)
(Я действительно не понимаю, почему вы используете .astype()
вместо второго параметра для frombuffer
; более того, мне интересно, почему вы используете np.int
, в то время как вы ранее говорили, чтомассив содержит double
с.)
Боюсь, это не станет намного легче, чем это, но это не так уж плохо, не правда ли?Вы можете похоронить все уродливые детали в функции-обертке и больше не беспокоиться об этом.