Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/155.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 X=np.复制(X)。。。这真的没用吗?_Python_Numpy_Scikit Learn_Copy - Fatal编程技术网

Python X=np.复制(X)。。。这真的没用吗?

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)将原始引用替换为可安全修改的副本引用。如果未将函数赋回已定义的

我目前正在查看github中的sklearn源代码,我遇到了一行让我感到困扰的代码。是的

我理解按值复制和按引用复制之间的区别(我猜numpy中的复制函数是按值复制的,x=y是按引用复制的)

但很明显,我不明白将同一变量复制到自身的目的

  • 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
是一个可变对象,它会复制到自身,以防止在函数范围之外发生任何更改。