从 numpy.dtype 为结构化数组创建自己的类型。获得这个最干净的方法是什么?

Creating own type from numpy.dtype for structured array. What is the cleanest way to obtain this?

我想像这样从 numpy.dtype 派生出自己的 class:

import numpy as np
class A(np.dtype):
    def __new__(cls):
        cls.fields = [("field1", np.int32), ("field2"), np.int64)]

但是,numpy不让我这样做:

type 'numpy.dtype' is not an acceptable base type

因此我开始摆弄 metaclasses。但是,我的代码没有使用 name, bases, dct。这基本上可以吗?我的意思是,它有效,但它是一个好方法吗?

class NumpyDType_Meta(type):
    def __new__(cls, name, bases, dct, **args):
        return np.dtype(**args)
    
class A(metaclass = NumpyDType_Meta, 
        dtype = [("field1", np.int32), ("field2"), np.int64)]):
    pass


arr = np.array([[1,2],[3,4]], dtype = A)


arr
array([[(1, 1), (2, 2)],
       [(3, 3), (4, 4)]], dtype=[('field1', '<i4'), ('field2', '<i8')])

您不需要在那里创建另一个“dtype”class - 只需一个 dtype 实例。

实际上,您通过元class 土地的旅程就是这样做的 - 作为您的 __new__ 方法 returns dtype 实例,它取代了 class A 在你的 body 中声明。当您将 **args 传递给 dtype 构造函数时,您将规范作为“dtype”关键字参数传递给 class,它恰好起作用。

但是在 arr 声明之前的所有代码都与简单地做的一样:

A = np.dtype([("field1", np.int32), ("field2", np.int64)]) 

这会为您的子字段创建一个新的 dtype,这正是您所需要的。