【问题标题】:Why sum behaves differently after I import NumPy [closed]为什么在我导入 NumPy 后 sum 的行为会有所不同[关闭]
【发布时间】:2019-12-25 07:37:44
【问题描述】:

为什么我导入 NumPy 后结果不一样?

print(sum(range(5),-1))

答案是 9

from numpy import *
print(sum(range(5),-1))

答案是 10

【问题讨论】:

  • numpy 导入所有内容后,sum 变为numpy.sumnumpy.sum 的第二个参数(即在您的情况下为 -1)被理解为 axis,而不是另一个要执行的元素 sum
  • 你的问题应该是“numpy.sum 返回的结果与内置的sum 不同?你导入东西的事实并不真正相关。
  • 这就是为什么Style Guide for Python Code 说:“应该避免通配符导入 (from <module> import *),因为它们使命名空间中存在哪些名称变得不清楚,从而使读者和许多自动化工具感到困惑。”

标签: python numpy python-import


【解决方案1】:

应谨慎覆盖内置函数。

import * 可能很危险。

内置的sumnumpy 中定义的sum 用于不同的目的 - 因此有不同的答案。

Help on built-in function sum in module __builtin__:

sum(...)
    sum(iterable[, start]) -> value

    Return the sum of an iterable or sequence of numbers (NOT strings)
    plus the value of 'start' (which defaults to 0).  When the sequence is
    empty, return start.
(END)


>>> import numpy
>>> help(numpy.sum)
Help on function sum in module numpy.core.fromnumeric:

sum(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue>)
    Sum of array elements over a given axis.

    Parameters
    ----------
    a : array_like
        Elements to sum.
    axis : None or int or tuple of ints, optional
        Axis or axes along which a sum is performed.  The default,
        axis=None, will sum all of the elements of the input array.  If
        axis is negative it counts from the last to the first axis.

        .. versionadded:: 1.7.0

        If axis is a tuple of ints, a sum is performed on all of the axes
        specified in the tuple instead of a single axis or all the axes as
        before.
    dtype : dtype, optional
        The type of the returned array and of the accumulator in which the
        elements are summed.  The dtype of `a` is used by default unless `a`
        has an integer dtype of less precision than the default platform
        integer.  In that case, if `a` is signed then the platform integer
        is used while if `a` is unsigned then an unsigned integer of the
        same precision as the platform integer is used.
    out : ndarray, optional
        Alternative output array in which to place the result. It must have
        the same shape as the expected output, but the type of the output
        values will be cast if necessary.
    keepdims : bool, optional
        If this is set to True, the axes which are reduced are left
        in the result as dimensions with size one. With this option,
        the result will broadcast correctly against the input array.

        If the default value is passed, then `keepdims` will not be
        passed through to the `sum` method of sub-classes of
        `ndarray`, however any non-default value will be.  If the
        sub-classes `sum` method does not implement `keepdims` any
        exceptions will be raised.

    Returns
    -------
    sum_along_axis : ndarray
        An array with the same shape as `a`, with the specified
        axis removed.   If `a` is a 0-d array, or if `axis` is None, a scalar
        is returned.  If an output array is specified, a reference to
        `out` is returned.

    See Also
    .
    .
    .

>>>

【讨论】:

    【解决方案2】:

    这是因为 Python 内置的 sum 函数被 numpy.sum 覆盖。

    当您评估内置 python sum(range(5),-1) 时,它的评估结果类似于 -1 + sum([0,1,2,3,4])

    相比之下,numpy.sum 假定 -1 是轴参数,表示输入数组的最后一个(也是唯一一个)轴。所以,你实际上得到了np.sum(range(5))

    【讨论】:

    • 在标准库的 sum 中,第二个参数不被解释为输入列表的一部分,它是 sum 的起始值(默认为 0)。见the doc
    • 很公平。我的意思是强调它已添加到最终输出中,但可以做得更好。
    • 我想它对非交换操作有影响。
    【解决方案3】:

    这是因为numpy.sum 中的第二个参数是axis 参数,根据the documentation。由于输入是一维数组,sum(range(5), -1) 沿最后一个(也是唯一一个)轴求和,因此等于 sum(range(5)),等于 10。

    在标准库的sum()中,第二个参数是the initial value of the sum,默认为0。

    所以你的代码等价于-1 + sum(range(5)),等于9。

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2012-08-28
      相关资源
      最近更新 更多