Это несколько способов снять шкуру с кошки, но если вы используете ctypes
, есть возможность придерживаться ctypes
, например:
Вы можете создать массив и инициализировать его с помощью значения, например:
ptr_to_buffer=(ctypes.c_double*5)(phi,esv,cv1,cv2,cv3)
user_data = ctypes.cast(ptr_to_buffer, ctypes.c_void_p)
или если данные уже находятся в массиве numpy (как я изначально понял ваш вопрос):
import numpy as np
a=np.array([1.0, 2.0, 3.0, 4.0, 5.0], np.float64)
import ctypes
ptr_to_buffer=(ctypes.c_double*5).from_buffer(a)
user_data = ctypes.cast(ptr_to_buffer, ctypes.c_void_p)
в данном случае user_data
является копией a и не разделяет память, что иногда хорошо, а иногда нет.
Для больших массивов можно также разрешить user_data
также делить память с numpy - array:
user_data = ctypes.c_void_p(a.__array_interface__['data'][0])
, что можно проверить с помощью:
ctypes.cast(user_data, ctypes.POINTER(ctypes.c_double))[0] = 42.0
print(a[0])
# 42.0 and not 1.0
Для этого варианта вам действительно нужно проверить, что память numpy -массив является непрерывной, для Например, как получить эту информацию, можно посмотреть, например, в numpy.ctypeslib.as_ctypes
.
Возможно, менее низкоуровневым способом получения указателя является
user_data = ctypes.cast(np.ctypeslib.as_ctypes(a), ctypes.c_void_p)
но все же необходима проверка формы / шагов.