按需更新数据的数据阵列

2024-09-30 06:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望有一个系统,其中我有一个“数据类”,其中有一些数组和一个“选择类”,其中有相同的数组名,其数据只是数据类中数组子集的一个视图。哪些应该由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.

将不再工作,因为属性已经切片,并且不再映射回其他切片。你知道吗

我将非常感谢任何有关解决这一结构的暗示。你知道吗

大卫


Tags: 数据selfnoneobj属性def数组array
1条回答
网友
1楼 · 发布于 2024-09-30 06:22:23

如果你想要一个像

SObj1.X = 10

要更改某些远程源的值,应该重写SelObj类中的__setattr__方法。像这样:

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 )

    def __setattr__(self, name, value):
        setattr(self.DataObj, name, value) # updates the source of the data
        super(SelObj, self).__setattr__(name, value) # updates the representation

相关问题 更多 >

    热门问题