我希望有一个系统,其中我有一个“数据类”,其中有一些数组和一个“选择类”,其中有相同的数组名,其数据只是数据类中数组子集的一个视图。哪些应该由selection类的实例决定。如果在Selection类的实例中更改了某些内容,那么它应该被映射回相应的数据类,并且使事情变得非常困难,不仅Selection类中的数组应该是实数数组(所有方法都应该工作),它们还应该是原始数据的视图,或者只能按需创建。你知道吗
到目前为止我创造的脚手架是
import numpy as np
class DataObj():
def __init__( self, Data_dict ):
self.arrays = [ n for n,d in Data_dict.iteritems() ]
for n,d in Data_dict.iteritems():
setattr( self, n, d )
class Darray(np.ndarray):
def __new__(cls, input_array, SelObj, *args, **kwargs):
obj = np.asarray(input_array[ SelObj.selA, SelObj.selB ]).view(cls)
obj.SelObj = SelObj
return obj
def __array_finalize__(self, obj):
if obj is None: return
def __getitem__(self, index):
return super(Darray, self).__getitem__(index)
class SelObj():
def __init__(self, DataObj, selA, selB):
self.selA = selA
self.selB = selB
self.DataObj = DataObj
for n in DataObj.arrays:
Darr = Darray( getattr( self.DataObj, n), self )
setattr( self, n, Darr )
### creating some objects
DObj = DataObj({ "X":ones((10,20)),
"Y":zeros((10,20)),
"Z":arange(10*20).reshape(10,20) })
SObj1 = SelObj( DObj, array([1,3,4]), slice(None,None,2) )
SObj2 = SelObj( DObj, array([4,5,7]), slice(None,2,None) )
SObj3 = SelObj( DObj, array([1,3,4]), slice(None) )
这是可行的,但现在如果一个
SObj1.X = 10
它失去了连接,只有一个10而不是原来的数组。即使我做了一些有意义的事
SObj1.X[0,0] = 10.
这不会出现在DObj中(因为我用input_array[ SelObj.selA, SelObj.selB ]
创建了数组的副本)。现在每个SObj都有自己的数据,最终会阻塞内存。你知道吗
我知道我想要的并不容易,但我仍然愿意去做。我还研究了属性,并使每个Darray都成为SObj的属性;每当调用属性时,都按需进行切片。但是接下来的事情
SObj1.X[0,0] = 10.
将不再工作,因为属性已经切片,并且不再映射回其他切片。你知道吗
我将非常感谢任何有关解决这一结构的暗示。你知道吗
大卫
如果你想要一个像
要更改某些远程源的值,应该重写
SelObj
类中的__setattr__
方法。像这样:相关问题 更多 >
编程相关推荐