2015-08-27 66 views
0

我想定義一個類型爲numpy.ndarray的包裝類。該屬性必須通過調用__init__()來初始化。初始化類與numpy.ndarray屬性

該腳本按照預期爲1D陣列運行。然而,在多dimensionnal陣列的情況下,蟒蛇返回以下錯誤:only length-1 arrays can be converted to Python scalars

import numpy as np 

class myArr(np.ndarray): 
    def __init__(self,Arr): 
     self.Arr = Arr 

npArr = np.zeros((3)) # works 
#npArr = np.zeros((3,5)) # does not work 
print npArr 

wrappedArr = myArr(npArr) 
print wrappedArr.Arr 

這到底是怎麼回事?

蟒蛇2.7.6,1.8.2 numpy的

回答

1

如果你只是想有ndarray類型的屬性是存在的,你從它繼承任何具體的原因是什麼?

我想說,通過繼承ndarray和覆蓋__init__你搞亂了numpy的初始化過程,從而產生你所看到的錯誤。

查看有關Subclassing ndarray的numpy文檔以獲取更多信息。

object(轉換MyArr到正規的新式類)繼承解決您的問題:

import numpy as np 

class MyArr(object): 
    def __init__(self, arr): 
     self.arr = arr 

np_arr_1 = np.zeros((3)) 
np_arr_2 = np.zeros((3, 5)) 

wrapped_arr_1 = MyArr(np_arr_1) 
wrapped_arr_2 = MyArr(np_arr_2) 

print wrapped_arr_1.arr 
print wrapped_arr_2.arr 
+0

謝謝您的回答!我實現這個包裝類的原因是,我有一個代碼,其中'numpy.roll()'經常被調用,通常在單個代碼行中多次調用。爲了提高代碼的可讀性,我想定義一個'__call __()'方法作爲替代。它會被定義爲'__call __(i,j):numpy.roll(self,[i,j])''。你認爲這是合適的方法嗎? –

+0

我不認爲你需要經歷'ndarray'子類的麻煩,只需使用'self.arr'而不是'self'調用'numpy.call'即可。 – agmangas