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

时间:2018-12-13 04:35:27

标签: arrays python-3.x numpy ctypes numpy-ndarray

这是一小段代码,我必须将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秒!因此,这一行现在是我整个流程的瓶颈。我想知道是否有更快的方法。

更新

请注意问题中的“传递给C语言中的函数” 。更具体地说,我想将一个numpy数组放入IMAGE数据结构中,并将其传递给rgbgr_image函数。您可以同时找到here

2 个答案:

答案 0 :(得分:1)

OP的答案制作了my_numpu_array的4份副本,其中至少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拥有其自己的数据,因此它应该在此处返回一个视图。

答案 1 :(得分:0)

所以我设法使用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)不能正常工作。因此,如果任何人都可以解释,那就太好了。