【发布时间】:2015-10-20 21:38:41
【问题描述】:
如果我有一个带有某个dtype 的numpy ndarray,我怎么知道对应的ctypes 类型是什么?
例如,如果我有一个 ndarray,我可以执行以下操作将其转换为共享数组:
import multiprocessing as mp
import numpy as np
import ctypes
x_np = np.random.rand(10, 10)
x_mp = mp.Array(ctypes.c_double, x_np)
但是,我必须在此处指定c_double。如果我没有指定完全相同的类型,它会起作用,但我想保持类型相同。我应该如何自动找出 ndarray x_np 的 ctypes 类型,至少对于一些常见的基本数据类型?
【问题讨论】:
-
由于多处理模块会复制数组,您可能希望使用多处理分配 ctypes 数组,然后使用 numpy 从另一个进程(不复制)访问它,例如主进程:
x_mp = mp.Array('d', 100);子进程:x_np = np.reshape(np.ctypeslib.as_array(x_mp.get_obj()), (10, 10));x_np[:] = np.random.rand(10, 10). -
对于共享数组,您真正需要的只是一个字节数组,假设它足够大,然后您可以使用
np.frombuffer和np.reshape适当地转换它。这样,数据全部由您的 numpy 代码确定,而多处理数组只是提供共享内存的后备存储。 -
谢谢!是的,任何一种方式都适合我,但我从我的用户那里得到的是一个 numpy 数组。因此,如果我遵循您的方法,我仍然必须弄清楚在给定一个 numpy 数组的命令中将什么放入
'd'部分。你有什么主意吗?目前我只是使用自定义字典从 numpy.dtype.type 映射到 ctypes 类型。 -
如果您可以使用私有副本而不是共享原始数组,请注意第一步是展平数组,例如
x_np = x_np.flatten(),因为您上面的示例不起作用。然后得到ct = np.ctypeslib.as_ctypes(x_np)并通过_type_属性下降,直到你得到一个字符串,例如while not isinstance(ct, str): ct = ct._type_.