Python X=np.复制(X)。。。这真的没用吗?
我目前正在查看github中的sklearn源代码,我遇到了一行让我感到困扰的代码。是的 我理解按值复制和按引用复制之间的区别(我猜numpy中的复制函数是按值复制的,x=y是按引用复制的) 但很明显,我不明白将同一变量复制到自身的目的Python X=np.复制(X)。。。这真的没用吗?,python,numpy,scikit-learn,copy,Python,Numpy,Scikit Learn,Copy,我目前正在查看github中的sklearn源代码,我遇到了一行让我感到困扰的代码。是的 我理解按值复制和按引用复制之间的区别(我猜numpy中的复制函数是按值复制的,x=y是按引用复制的) 但很明显,我不明白将同一变量复制到自身的目的 X=np.副本(X) 有人能解释一下吗 非常感谢您softmax函数提供就地运行以保存复制op,从而用softmax的结果覆盖输入X 这里的副本是为了避免在需要时更改输入 X=np.copy(X)将原始引用替换为可安全修改的副本引用。如果未将函数赋回已定义的
- X=np.副本(X)
非常感谢您softmax函数提供就地运行以保存复制op,从而用softmax的结果覆盖输入X 这里的副本是为了避免在需要时更改输入
X=np.copy(X)
将原始引用替换为可安全修改的副本引用。如果未将函数赋回已定义的变量,您会如何怀疑函数的外观
def softmax(X, copy=True):
"""
Calculate the softmax function.
The softmax function is calculated by
np.exp(X) / np.sum(np.exp(X), axis=1)
This will cause overflow when large values are exponentiated.
Hence the largest value in each row is subtracted from each data
point to prevent this.
Parameters
----------
X : array-like, shape (M, N)
Argument to the logistic function
copy : bool, optional
Copy X or not.
Returns
-------
out : array, shape (M, N)
Softmax function evaluated at every point in x
"""
def _softmax(X):
max_prob = np.max(X, axis=1).reshape((-1, 1))
X -= max_prob
np.exp(X, X)
sum_prob = np.sum(X, axis=1).reshape((-1, 1))
X /= sum_prob
return X
return _softmax(np.copy(X) if copy else X)
这会降低代码的可读性。
在预处理变量时覆盖局部变量通常是可以接受的,因为它可以使代码可读。添加第二个变量将使理解代码更加困难。在我的示例中,我尝试创建易于理解且无任何重复的代码。但是你不能再读这个序列码了。您首先需要阅读最后一条语句\u softmax(np.copy(X)if copy else X)
,以了解它是如何使用的
在性能方面,这还引入了一个在这些低级函数中不需要的额外调用。当函数对
X
进行更改时,X
是一个可变对象,它会复制到自身,以防止在函数范围之外发生任何更改。