Какой самый быстрый способ преобразования массива numpy в массив ctype? - PullRequest
0 голосов
/ 13 декабря 2018

Вот фрагмент кода, который мне нужно преобразовать в массив ctype ctype ntype, чтобы я мог передать его некоторым функциям на языке C:

arr = my_numpy_array
arr = arr/255.
arr = arr.flatten()
new_arr = (c_float*len(arr))()
new_arr[:] = arr

, но последняя строка на самом деле дляцикл, и мы все знаем, насколько пресловутый python, когда дело доходит до циклов для массива изображений среднего размера, это занимает около 0,2 секунды !!так что эта линия сейчас является бутылочным горлышком всего моего трубопровода.Я хочу знать, есть ли более быстрый способ сделать это.

Обновление

Пожалуйста, обратите внимание ", чтобы перейти к функции в C" в вопросе.Чтобы быть более конкретным, я хочу поместить массив данных в структуру данных IMAGE и передать его в функцию rgbgr_image.Вы можете найти оба здесь

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Ответ ОП составляет 4 копии my_numpu_array, по крайней мере 3 из которых должны быть излишними.Вот версия, которая их избегает:

# random array for demonstration
my_numpy_array = np.random.randint(0, 255, (10, 10))

# copy my_numpy_array to a float32 array
arr = my_numpy_array.astype(np.float32)

# divide in place
arr /= 255

# reshape should return a view, not a copy, unlike flatten
ctypes_arr = np.ctypeslib.as_ctypes(arr.reshape(-1))

В некоторых случаях reshape вернет копию, но, поскольку arr гарантированно владеет своими собственными данными, она должна вернутьвид здесь.

0 голосов
/ 13 декабря 2018

Так что мне удалось сделать это странным образом, используя numpy:

arr = my_numpu_array
arr = arr/255.
arr = arr.flatten()
arr_float32 = np.copy(arr).astype(np.float32)
new_arr = np.ctypeslib.as_ctypes(arr_float32)

В моем случае это работает в 10 раз быстрее.

[Редактировать]: я не знаю почемуон не работает без np.copy или reshape(-1).Так что было бы замечательно, если бы кто-нибудь мог объяснить.

...