我使用python 2.7。 假设我有一个数组X和一个以这个数组为中心的函数:
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.]])
现在让我们计算均值(根据每一列)并根据第j列的平均值编写使每个X[i,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
for
(center
函数内部),并处理副本以保持{{1}原样。
请注意,处理int或float时不会出现此问题。
PS:我认为问题依赖于数组的存储方式以及用Python进行广播的方式,但我相信有一种方法可以更好地控制它感谢您的时间