2016-06-07 109 views
0

我正在寫這個類來規範數組中的數據。當我使用self.x上的範數函數返回規範化的矩陣時,self.x會被覆蓋。類內Python範圍

不知道爲什麼self.x矩陣覆蓋掉了:

class normData(): 

    def __init__(self, file): 
     self.file = file 
     self.data = self.readtxt() 
     self.x = self.data[:,0:-1] 
     self.y = self.data[:,-1] 
     # self.y_norm = self.norm(self.y) 
     # self.x_norm = self.norm(self.x) 

    def readtxt(self): 
     arr = [] 
     data = open(self.file, 'r') 
     for line in data.readlines(): 
      point = line.split(',') 
      arr.append([float(point[i]) for i in range(len(point))]) 
     arr = np.append(np.ones([len(arr),1]),arr,1) 
     return arr 

    def norm(self, matrix): 
     mat = matrix 
     col_num = len(mat[0]) 
     row_num = len(mat) 
     mu = np.array([np.average(mat[:,i]) for i in range(col_num)]) 
     size = np.array([max(mat[:,i])-min(mat[:,i]) for i in range(col_num)]) 
     for i in range(len(size)): 
      if (size[i] > 0.00001): 
       mat[:,i]=(mat[:,i]-mu[i])/size[i] 
     return mat 

我的猜測是可變的「墊子」被作爲對象「矩陣」(self.x傳入規範),在內存中,並且然後覆蓋?

編輯/問題澄清:避免覆蓋python類結構中現有數據的最佳方法是什麼?

+1

如果在Python類結構中不起作用 –

+0

?可以使用'.copy()'或者'import deepcopy'「:該類與它無關。更多的事實是,賦值並不總是複製東西(當使用'='時,引用列表和numpy數組,而不是複製)。 – Evert

回答

3

在Python中,任何超越簡單的內置類型的傳遞通過引用功能,這意味着功能沒有得到一個對象的副本,而對象本身:

def f(x): 
    x[2] = 100 

x = [1, 2, 3, 4] 
f(x) 
print(x) 
# [1, 2, 100, 4] 

這也是賦值運算符的真實:簡單地說y = xmat = matrix不會使對象的副本,而是創建了一個新的名字指向同一個對象:

x = [1, 2, 3, 4] 
y = x 
y[2] = 100 
print(x) 
# [1, 2, 100, 4] 

如果你真的想要一個numpy的陣列或任何副本其他對象,你編輯是明確的。與numpy的做到這一點的方法之一是使用.copy()方法:

x = np.arange(4) 
y = x.copy() 
y[2] = 100 
print(y) 
# [ 0 1 100 3] 
print(x) 
# [0 1 2 3] 

無論你是一個類中操作,這將舉行。

+0

謝謝,有用的解釋 – bpr