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

Arrays 将numpy数组转换为ctype数组的最快方法是什么?,arrays,python-3.x,numpy,ctypes,numpy-ndarray,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秒!!所以这条线现在是我整个管道的瓶颈。我想知道有没

下面是一段代码,我必须将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中的函数”。更具体地说,我想在
IMAGE
数据结构中放置一个numpy数组,并将其传递给
rgbgr\u IMAGE
函数。您可以同时找到这两个

,因此我使用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
重塑(-1)
,它就不能工作。因此,如果有人能解释的话,那就太棒了。

OP的答案制作了4份
my_numpu_数组
,其中至少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))

在某些情况下,将返回一个副本,但由于
arr
保证拥有它自己的数据,因此它应该在此处返回一个视图。

注意,
flatten
仅更改数组上的视图,而
astype
本身会进行复制。因此您可以省略这两个步骤:
arr\u float32=my\u numpy\u array.astype(np.float32)/255
@Jeronimo检查<代码>展平也会复制一份。@tel比这更好。我知道,我也试过。。。就python而言,一切都很好。我尝试了这些,这就是为什么我认为我的答案是“奇怪”。它们在python中看起来是一样的:形状和类型。但将其传递给用C编写的函数会崩溃。我必须要有一个
np.copy
我想这与我传递的指针有关。。另外,它不适用于
重塑
@EhsanFathi:我认为您可能会遇到,这将在1.16中修复