Python 2.7 类中的Python作用域
我编写这个类是为了规范化数组中的数据。当我在self.x上使用norm函数返回规范化矩阵时,self.x被覆盖 不确定为什么会覆盖self.x矩阵: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
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数组是被引用的,而不是被复制的)。谢谢,有用的解释谢谢,有用的解释