我正在编写此类来规范化数组中的数据。当我在self.x上使用norm函数返回规范化矩阵时,self.x会被覆盖。
不确定为什么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
我的猜测是变量'mat'被视为内存中的对象'matrix'(self.x传递到norm)然后被覆盖?
编辑/问题澄清:避免覆盖python类结构中现有数据的最佳方法是什么?
答案 0 :(得分:3)
在Python中,除了简单的内置类型之外的任何东西都通过引用传递给函数,这意味着函数不会获得对象的副本,而是获取对象本身:
def f(x):
x[2] = 100
x = [1, 2, 3, 4]
f(x)
print(x)
# [1, 2, 100, 4]
赋值运算符也是如此:简单地说y = x
或mat = 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]
无论你是否在课堂上进行操作,都会有效。