2012-10-03 70 views
1

有人問這裏的問題:Subclassing numpy ndarray problem但它基本上沒有答案。python numpy中的子類ndarray:更改數組的大小和值

這是我的問題版本。假設您將numpy.ndarray子類化爲當您嘗試將元素設置爲超出當前形狀之外時自動展開的內容。您需要覆蓋setitem並使用一些numpy.concatenate調用來構造一個新數組,然後以某種方式將其分配給「self」。如何將數組分配給「自我」?

class myArray(numpy.ndarray): 
    def __new__(cls, input_array): 
     obj = numpy.asarray(input_array).view(cls) 
     return(obj) 

    def __array_finalize__(self, obj): 
     if obj is None: return 

    try: 
     super(myArray, self).__setitem__(coords, value) 
    except IndexError as e: 
     logging.error("Adjusting array") 
     ... 
     self = new_array # THIS IS WRONG 
+0

對自己的分配似乎只是無稽之談,你如何支持替換一個對象?此外,使用numpy數組做這樣的操作會使數組視圖無效。你不能用子類來做到這一點,有一個原因'ndarray.resize'是如此限制... – seberg

回答

3

爲什麼是子類?爲什麼不給你的包裝對象它自己的數據成員是ndarray並使用__getitem____setitem__對包裝數據成員進行操作?這基本上就是ndarray已經包裝了Python的內置容器。也看看Python Pandas,它已經做了很多你在談論的東西包裹在ndarray之上。

+1

是的,這是我目前正在做的。但是接下來我必須手動包裝所有我想公開給類的ndarray(我的意思是數組)屬性和函數嗎?例如,我必須在類定義中實現「__repr__」。這些很簡單,但我認爲繞過這是子類化的一個點。也許還有另一個竅門? Python Pandas太棒了!我正試圖更多地使用它。 – mathtick

+0

如果你想要底層數據的'__repr__',你應該只能調用'MyClass.data .__ repr__'。我可以想象,包裝它應該只需要你爲一些'ndarray'默認值做些額外的工作。你的大部分代碼不應該嘗試像MyClass.sum()這樣的事情,而應該去做MyClass.data.sum()等等...... – ely