【问题标题】:The corresponding ctypes type of a numpy.dtype?numpy.dtype 对应的 ctypes 类型?
【发布时间】: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_.

标签: numpy ctypes


【解决方案1】:

numpy.ctypeslib.as_ctypes_type(dtype) 现已支持此功能:

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

按预期提供ctypes.c_double。

【讨论】:

    【解决方案2】:

    实际上有一种方法可以做到这一点,那就是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}
    

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2012-04-13
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2022-11-10
      • 2021-08-02
      • 2011-09-19
      • 2017-08-03
      相关资源
      最近更新 更多