numpy.dtype的对应ctypes类型?

numpy.dtype的对应ctypes类型?,numpy,ctypes,Numpy,Ctypes,如果我有一个带有特定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) 但是,我必须在这里指定cudouble。如果我不指定完全相同的

如果我有一个带有特定
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)

但是,我必须在这里指定
cudouble
。如果我不指定完全相同的类型,它就可以工作,但我希望保持类型不变。至少对于一些常见的基本数据类型,我应该如何自动找到ndarray的ctypes类型

输出:

ctypes.c_double
需要注意的是,
np.ctypeslib.\u get\u typecodes
函数被标记为private(即它的名称以
\u
开头)。然而,它的实现似乎在一段时间内没有改变,所以您可以相当可靠地使用它

或者,
\u get\u typecodes
的实现非常短,因此您也可以将整个函数复制到您自己的代码中:

import ctypes
import numpy as np

def get_typecodes():
    ct = ctypes
    simple_types = [
        ct.c_byte, ct.c_short, ct.c_int, ct.c_long, ct.c_longlong,
        ct.c_ubyte, ct.c_ushort, ct.c_uint, ct.c_ulong, ct.c_ulonglong,
        ct.c_float, ct.c_double,
    ]

    return {np.dtype(ctype).str: ctype for ctype in simple_types}
这一点现在得到以下方面的支持:

将numpy导入为np
x_np=np.random.rand(10,10)
np.ctypeslib.as_ctypes_type(x_np.dtype)

按预期提供
ctypes.c\u double

由于多处理模块复制了数组,因此您可能希望使用多处理分配ctypes数组,然后使用numpy从另一个进程(不复制)访问它,例如主进程:
x\u mp=mp.array('d',100)子进程:
x\u np=np.reformate(np.ctypeslib.as_数组(x\u mp.get\u obj(),(10,10))
x\u np[:]=np.random.rand(10,10)
。对于共享数组,您真正需要的是一个字节数组,假设它足够大,然后使用
np.frombuffer
np.restrape
对其进行适当的强制转换。通过这种方式,数据都由numpy代码决定,而多处理阵列只是提供共享内存的备份存储。谢谢!是的,这两种方法都适用于我,但我从用户那里得到的是一个numpy数组。因此,如果我遵循您的方法,我仍然需要考虑在给定numpy数组的命令中,在
'd'
部分中放置什么。你知道吗?目前,我只是使用一个自定义字典从numpy.dtype.type映射到ctypes类型。如果您同意使用私有副本而不是共享原始数组,请注意第一步是展平数组,例如,
x\u np=x\u np.flatte()
,因为上面的示例不起作用。然后获取
ct=np.ctypeslib.as\u ctypes(x\u np)
并通过
\u type\u
属性下降,直到得到一个字符串,例如
而不存在(ct,str):ct=ct.\u type
import ctypes
import numpy as np

def get_typecodes():
    ct = ctypes
    simple_types = [
        ct.c_byte, ct.c_short, ct.c_int, ct.c_long, ct.c_longlong,
        ct.c_ubyte, ct.c_ushort, ct.c_uint, ct.c_ulong, ct.c_ulonglong,
        ct.c_float, ct.c_double,
    ]

    return {np.dtype(ctype).str: ctype for ctype in simple_types}