将 numpy 数组转换为 ctype 数组的最快方法是什么?

What is the fastest way of converting a numpy array to a ctype array?

这是一段代码,我必须将 numpy 数组转换为 c_float ctype 数组,以便我可以将它传递给 C 语言中的一些函数:

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

但由于最后一行实际上是一个 for 循环,我们都知道 python 对于中等大小图像数组的 for 循环来说是多么臭名昭著,它大约需要 0.2 秒!!所以这一行现在是我整个管道的瓶颈。我想知道有没有更快的方法。

更新

请注意问题中的"to pass to a function in C"。更具体地说,我想在 IMAGE 数据结构中放置一个 numpy 数组并将其传递给 rgbgr_image 函数。您可以同时找到 here

所以我设法使用 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.copyreshape(-1) 的情况下它不起作用。所以如果有人能解释一下就太棒了。

OP 的答案复制了 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 会 return 一个副本,但由于 arr 保证拥有自己的数据,因此它应该 return 在此处查看。