2013-10-13 3 views
3

데이터가 단순한보기 인 동일한 배열 이름을 가진 "배열 클래스"와 "데이터 클래스"가있는 시스템을 갖고 싶습니다. Data 클래스의 배열의 서브 세트 어떤 것들은 선택 클래스의 인스턴스에 의해 결정되어야한다. Selection 클래스의 인스턴스에서 무언가를 변경하면 해당 Data 클래스로 다시 맵핑되어야하며, 선택 클래스의 배열이 실제 ndarrays가 될뿐만 아니라 (따라서 메서드가 제대로 작동해야 함) 원래 데이터에 대한 조회 만 가능하거나 요청에 따라 생성되어야합니다.nydarray가 필요에 따라 데이터를 업데이트합니다.

내가 지금까지 만든 비계는

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 

는 연결을 푼다 그냥 대신 원래 배열의 열을 가지고 작업을 수행합니다. 심지어 난 사실 (input_array[ SelObj.selA, SelObj.selB ]와 나는 배열의 복사본을 생성하기 때문에)이이 DObj에 나타나지 않습니다 의미

SObj1.X[0,0] = 10. 

처럼 만드는 일을 할 때. Ans는 이제 모든 SOBj가 결국 자신의 데이터를 가지게되어 결국 메모리가 막히게됩니다.

나는 내가 원하는 것이 쉽지 않을 것이라고 알고 있지만 나는 여전히 그것을하고 싶다. 나는 또한 속성을 찾고 모든 Darray를 SObj의 속성으로 만들었습니다. 속성이 호출 될 때마다 요청시 슬라이스를 수행합니다. 그러나 속성이 이미 분할되고 추가 슬라이스가 더 이상 다시 매핑되지 않기 때문에

SObj1.X[0,0] = 10. 

과 같은 항목은 더 이상 작동하지 않습니다.

이 구조의 해결책을 가리키는 모든 힌트에 대해 매우 감사하게 생각합니다. 데이비드

답변

0

당신이

SObj1.X = 10 

같은 표현이 먼 소스의 값을 변경하려는 경우

, 당신은 당신의 SelObj 클래스 __setattr__ 메소드를 오버라이드 (override)합니다. 좋아요 :

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 
관련 문제