从 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,这正是您所需要的。
我想像这样从 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,这正是您所需要的。