如果我有一个具有某个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类型,至少对于一些常见的基本数据类型?
答案 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
。