我想了解(並最終使用)使用來自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