numpy.dtype的相应ctypes类型?

时间:2015-10-20 21:38:41

标签: 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)

但是,我必须在此指定c_double。如果我没有指定完全相同的类型,它可以工作,但我想保持类型相同。我应该如何自动找出ndarray x_np的ctypes类型,至少对于一些常见的基本数据类型?

2 个答案:

答案 0 :(得分:1)

实际上有一种方法built into Numpy

x_np = np.random.rand(10, 10)
typecodes = np.ctypeslib._get_typecodes()
typecodes[x_np.__array_interface__['typestr']]

输出:

ctypes.c_double

需要注意的是,np.ctypeslib._get_typecodes函数被标记为私有(即,其名称以_开头)。但是,它的实现似乎并没有改变一段时间,因此您可以相当可靠地使用它。

或者,_get_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}

答案 1 :(得分:0)

np.ctypeslib.as_ctypes_type()现在支持此功能:

import numpy as np
x_np = np.random.rand(10, 10)
np.ctypeslib.as_ctypes_type(x_np.dtype)

按预期方式给ctypes.c_double