【问题标题】:Custom data types in numpy arraysnumpy 数组中的自定义数据类型
【发布时间】:2010-03-01 05:57:18
【问题描述】:

我正在创建一个 numpy 数组,该数组将填充我制作的特定类的对象。我想初始化数组,使其只包含该类的对象。例如,这就是我想做的事情,如果我这样做会发生什么。

class Kernel:
    pass

>>> L = np.empty(4,dtype=Kernel)

TypeError: data type not understood

我可以这样做:

>>> L = np.empty(4,dtype=object)

然后将L 的每个元素分配为Kernel 对象(或任何其他类型的对象)。但是,从编程的角度(类型检查)和数学的角度(对函数集的操作)来看,如果我能够拥有一个 Kernels 数组,那就太好了。

我有什么方法可以使用任意类指定 numpy 数组的数据类型?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如果您的内核类具有可预测的成员数据量,那么您可以为它定义一个数据类型而不是一个类。例如如果它由 9 个浮点数和一个 int 参数化,你可以这样做

    kerneldt = np.dtype([('myintname', np.int32), ('myfloats', np.float64, 9)])
    arr = np.empty(dims, dtype=kerneldt)
    

    每次您想要操作单个内核的方法时,您都必须进行一些强制转换以将它们转换为 Kernel 类的对象,但这是将实际数据存储在 NumPy 数组中的一种方式。如果您只想存储一个引用,那么 object dtype 是最好的,无需子类化 ndarray。

    【讨论】:

    • 这就是我要找的!虽然我开始认为这比它的价值要多得多......将阅读 np.dtype。
    【解决方案2】:
    【解决方案3】:

    据我所知,必须手动为 numpy.ndarray 中的元素强制执行单一类型(除非数组包含 Numpy 标量):没有内置检查机制(您的数组有 dtype=object) .如果您真的想强制执行单一类型,则必须将 ndarray 子类化并在适当的方法中实现检查(__setitem__ 等)。

    如果您想在一组函数(内核对象)上实现操作,您可以通过直接在内核类中定义正确的操作来实现。这就是我为我的 uncertainties.py 模块所做的,它处理 numpy.ndarrays 的不确定数字。

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      相关资源
      最近更新 更多