首页 > 解决方案 > 修改该函数之外的参数而不使用“返回”python的函数

问题描述

我使用python 2.7。假设我有一个数组 X 和一个根据 mean 将该数组居中的函数:

import numpy as np
X = np.array([[float(i+j) for i in range(3)] for j in range(3)])

如果我们此时打印 X

X = array([[ 0.,  1.,  2.],
           [ 1.,  2.,  3.],
           [ 2.,  3.,  4.]])

现在让我们计算平均值(根据每列)并编写X[i,j]根据第 j 列的平均值对每个居中的函数。

means = X.means(axis=0) #mean for each column

我们打印means = array([ 1., 2., 3.])(似乎是合法的)。

def center(arr, means) :
    for i, mean in enumerate(means) :
        arr[:, i] -= mean
    # Instructions
    # end of the function without return X or something

X让我们在:上调用这个函数center(X),然后再次打印X,将会有:

X = array([[-1., -1., -1.],
           [ 0.,  0.,  0.],
           [ 1.,  1.,  1.]])

所以,X被修改了,而它不应该被修改,因为它没有被返回。

我的问题是双重的: 1-为什么 X 在函数之外被修改而我不返回它 2- 有什么办法可以避免这种可能导致大混乱的修改

我找到的解决方案是np.copy在循环arr之前(在函数内部),并处理副本以保持原样。forcenterX

请注意,在处理 int 或 float 时不会出现此问题。

PS:我认为问题取决于数组的存储方式以及在 Python 中进行广播的方式,但我相信有一种方法可以更好地掌握它

谢谢你的时间

标签: pythonpython-2.7numpy

解决方案


推荐阅读