这是一小段代码,我必须将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
答案 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.copy
或reshape(-1)
不能正常工作。因此,如果任何人都可以解释,那就太好了。