Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 类中的Python作用域_Python 2.7_Numpy - Fatal编程技术网

Python 2.7 类中的Python作用域

Python 2.7 类中的Python作用域,python-2.7,numpy,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.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”在内存中作为对象“矩阵”(self.x传递到norm中),然后被覆盖


编辑/问题澄清:避免覆盖python类结构中现有数据的最佳方法是什么?

在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]

无论您是否在类中操作,这都适用。

在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]

无论您是否在一个类中操作,这都将保持不变。

您可以使用
.copy()
或者
导入deepcopy
,如果这在“python类结构中”不起作用:该类与此无关。更重要的是,赋值并不总是复制内容(当使用
=
时,列表和numpy数组被引用,而不是复制)。您可以使用
.copy()
或者
导入deepcopy
,如果这在“python类结构内”不起作用:类与此无关。更重要的是,赋值并不总是复制内容(当使用
=
时,列表和numpy数组是被引用的,而不是被复制的)。谢谢,有用的解释谢谢,有用的解释