我有一個問題。問題是:我想創建一個numpy數組的子類,然後創建一個該類型的對象數組。當我引用該數組中的項目時,我希望它仍然是該子類的一個實例。相反,它是numpy數組的一個實例。numpy的子類的數組
這是一個失敗的試驗:
import numpy as np
class ImageWrapper(np.ndarray):
def __new__(cls, image_data):
assert image_data.ndim in (2, 3)
return image_data.view(cls)
@property
def n_colours(self):
return 1 if self.ndim==2 else self.shape[2]
n_frames = 10
frames = [ImageWrapper(np.random.randint(255, size = (20, 15, 3)).astype('uint8')) for _ in xrange(n_frames)]
video = np.array(frames)
assert video[0].n_colours == 3
給我:AttributeError的: 'numpy.ndarray' 對象有沒有屬性 'n_colours'
我怎樣才能使這項工作?
事情已經試過:
- 設置subok =構建視頻時真實的 - 從子類對象的單個實例,而不是一個列表構建一個數組時,這只是工作。
- 設置D型=對象或D型= ImageWrapper不起作用
我認識到,我可以只讓視頻列表,但它是最好保持它作爲其他原因numpy的陣列。
的問題是,當你調用'3D陣列的列表上array',你會得到一個四維陣列,而不是一維數組全的3D陣列。顯然,4D數組不能是'ImageWrapper',所以它是一個'ndarray',所以它的任何一部分都是一個'ndarray',無論數據來自哪裏。問題是,_why_你想要它是一個數組嗎?對象的一維數組並不會失去numpy對本地列表的好處,但它會失去它們的一個_lot_,如果你能在最後一句中告訴我們「其他原因」,它可能會有所幫助。 – abarnert
另外,你的設計是否有一個原因要求4D陣列_不能成爲ImageWrapper?如果N> 3(或者只是引發一個異常),你的'n_colours'將不得不返回一個N-3維數組而不是標量數組,否則,會出現什麼問題?因爲這會使事情變得更簡單... – abarnert
「其他原因」並不是一個很好的理由,它只是數組是預期數據類型的接口的一部分。在這種情況下,Jaime建議的對象數組將會執行。 – Peter