2014-07-22 3 views
2

배열을 반환하는 Python 객체의 속성이 있습니다. 이제 전체 배열을 설정할 수 있도록 해당 속성의 setter를 설정할 수 있습니다. 그러나 속성을 통해 설정할 수있는 요소를 만드는 방법을 놓치고 있습니다.NumPy 배열 속성의 요소를 설정하는 방법은 무엇입니까?

나는 (빈 SomeClass 클래스를 제공) 사용자의 관점에서 기대 :

이제
>>> x = SomeClass() 
>>> x.array = [1, 2, 3] 
>>> x.array[1] = 4 
>>> print (x.array) 
[1, 4, 3] 

, 모든 것은 여전히 ​​위의 작동

class SomeClass(object): 
    def __init__(self, a): 
     self._a = a 

    @property 
    def array(self): 
     return self._a 
    @array.setter 
    def array(self, a): 
     self._a = a 

으로 SomeClass.array 정의 속성이라고 가정합니다. 또한 나는 setter에서 NumPy 배열을 단순하게 만들었습니다.

그러나 return self._a을 NumPy 함수 (요소를 통해 벡터화 된 방식으로 바꿉니다.)와 역함수로 self._a = a을 바꾸면 항목이 더 이상 설정되지 않습니다.

예 :

import numpy as np 

class SomeClass(object): 
    def __init__(self, a): 
     self._a = np.array(a) 

    @property 
    def array(self): 
     return np.sqrt(self._a) 
    @array.setter 
    def array(self, a): 
     self._a = np.power(a, 2) 

이제 사용자가 다음과 같은 출력 본다 :

>>> x = SomeClass([1, 4, 9]) 
>>> print (x.array) 
array([1., 2., 3.]) 
>>> x.array[1] = 13 
>>> print (x.array) # would expect an array([1., 13., 3.]) now! 
array([1., 2., 3.]) 

나는 문제가 어디에서 오는지 이해 생각은 (배열 NumPy와는 작동 중에 생성하는 자사의 요소를 가져옵니다 변경되었지만 저장된 배열에는 영향을주지 않습니다).

SomeClass 배열의 단일 요소를 개별적으로 쓰기 액세스 가능하게하고 따라서 설정 가능하게하려면 어떻게해야합니까? 당신의 힌트와 도움을

고마워, TheXMA

@Jaime 그의 대답 아래에 만든 점은 나에게 많은 도움이! 감사! 어레이 가변 개체이므로

답변

0

개별 항목도 세터 기능없이 설정할 수있다 :

>>> class A(object): 
...  def __init__(self, a): 
...   self._a = np.asarray(a) 
...  @property 
...  def arr(self): 
...   return self._a 
... 
>>> a = A([1,2,3]) 

>>> a.arr 
array([1, 2, 3]) 

>>> a.arr = [4,5,6] # There is no setter... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: can't set attribute 

>>> a.arr[1] = 7 # ...but the array is mutable 
>>> a.arr 
array([1, 7, 3]) 

후자가 변하기 때문에 이것이 튜플 대리스트의 용도 중 하나이지만, 전 때로 믿을 '티. 어쨌든, 당신의 질문에 대답하기 위해서 : getter가 객체 자체를 반환하는 한 개별 항목을 설정할 수 있도록하는 것이 쉽습니다.

두 번째 예제의 더 멋진 성능은 어떤 간단한 방법으로도 쉽게 얻을 수없는 것처럼 보입니다. SomeClass.array 속성을 하위 클래스 인 ndarray으로 지정하거나 인스턴스를 래핑하는 맞춤 클래스로 만들면 문제가 발생할 수 있다고 생각합니다. 어쨌든 중요한 일은별로 없을 것입니다.

+0

좋아요, 그래서 저는 첫 번째 예제가 정확하게 작동한다고 생각한 것입니다. 사실, 두 번째 것은 제가 목표로 삼은 것입니다 ... 불행히도. 배열 종류의 데이터 구조를 클래스의 (일종의) 속성으로 만들고 요소를 변경할 수있게 만든 적이있는 사람이 있습니까? – TheXMA

+0

[This answer] (https://stackoverflow.com/questions/16893089/how-to-implement-an) 다음과 같은 방식으로 'SomeClass.array'의 구현을 프록시로 참조하면 궁금합니다. -array-like-property-wrapper-in-python)? – TheXMA

+0

네, 그 아이디어가 될 것입니다 ... 그 질문에 대한 대답, 즉 ndarray 인스턴스를 래핑하는 클래스에서 접근법의 문제점은 명시 적으로 랩핑하는 기능 만 수행 할 수 있다는 것입니다. 구현시,'a.arr + = 1'을 할 수 없습니다. – Jaime

관련 문제