类中的Python范围

时间:2016-06-07 04:44:38

标签: python-2.7 numpy

我正在编写此类来规范化数组中的数据。当我在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类结构中现有数据的最佳方法是什么?

1 个答案:

答案 0 :(得分: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]

无论你是否在课堂上进行操作,都会有效。