我想了解(并最终使用)使用来自numpy的记录数组的对象数组的实现:Numpy object array在审查代码我显然正在学习关于python的新东西,我似乎无法充分了解以下内容:通过函数的Python对象
在obarray.py文件中的函数用于创建一个新的对象,我很困惑,
- 为什么使用功能,
- 参数如何玩成功能,
- 如何使用此函数与直接使用参数创建类不同(推测使用参数作为属性),并且
- 这是什么主要 .Obarray我刚刚调用函数时得到了什么?
对于1和2我有一种预感:参数在某种程度上成为对象“局部作用域”,并且可能类似于对象属性?
下面是从该链接的新对象的代码:
import numpy as np
def make_obarray(klass, dtype):
class Obarray(np.ndarray):
def __new__(cls, obj):
print "CLS:", cls
print "OBJ:", obj
A = np.array(obj,dtype=np.object)
N = np.empty(shape=A.shape, dtype=dtype)
for idx in np.ndindex(A.shape):
for name, type in dtype:
N[name][idx] = type(getattr(A[idx],name))
return N.view(cls)
def __getitem__(self, idx):
V = np.ndarray.__getitem__(self,idx)
if np.isscalar(V):
kwargs = {}
for i, (name, type) in enumerate(dtype):
kwargs[name] = V[i]
return klass(**kwargs)
else:
return V
def __setitem__(self, idx, value):
if isinstance(value, klass):
value = tuple(getattr(value, name) for name, type in dtype)
# FIXME: treat lists of lists and whatnot as arrays
return np.ndarray.__setitem__(self, idx, value)
return Obarray
这里是我正在测试它:
class Foo:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return "<Foo a=%s b=%s>" % (self.a, self.b)
dtype = [("a",np.int),
("b",np.float)]
FooArray = make_obarray(Foo, dtype)
A = FooArray([Foo(0,0.1),Foo(1,1.2),Foo(2,2.1),Foo(3,3.3)])
- 当我打电话FooArray我得到
__main__.Obarray
- 是什么这个? - 作为参数输入的“klass”和“dtype”发生了什么?
- 是如何从线沿线的东西此不同:
块引用
class Obarray(np.ndarray):
def __new__(cls,input_array, klass, dtype):
obj = np.assarray(input_array).view(cls)
obj.klass = klass
obj.dtype = dtype
A = np.array(obj,dtype=np.object)
N = np.empty(shape=A.shape, dtype=dt ype)
for idx in np.ndindex(A.shape):
for name, type in dtype:
N[name][idx] = type(getattr(A[idx],name))
obj.N = N.view(np.ndarray)
return obj
我不确定您的困惑是特定于此'numpy'代码还是更一般的。你知道关闭是如何工作的吗?你有没有曾经使用像'collections.namedtuple'这样的类型工厂? – Blckknght
这是一个更常见的问题,出现在这个代码中,所以我用它作为我的例子。是的,我熟悉namedtuple,然而,namedtuple是不可变的 – Skorpeo