为什么 sum 在我导入 NumPy 后表现不同
Why sum behaves differently after I import NumPy
为什么导入NumPy后结果不一样?
print(sum(range(5),-1))
答案是 9
from numpy import *
print(sum(range(5),-1))
答案是 10
发生这种情况是因为内置 python sum
函数被 numpy.sum
覆盖。
当您计算内置 python sum(range(5),-1)
时,它的计算结果类似于 -1 + sum([0,1,2,3,4])
.
相比之下,numpy.sum
假设 -1
是轴参数,表示输入数组的最后一个(也是唯一的)轴。所以,你有效地得到 np.sum(range(5))
.
应谨慎覆盖内置函数。
import *
可能很危险。
内置 sum
和 numpy
中定义的 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
.
.
.
>>>
这是因为 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.
为什么导入NumPy后结果不一样?
print(sum(range(5),-1))
答案是 9
from numpy import *
print(sum(range(5),-1))
答案是 10
发生这种情况是因为内置 python sum
函数被 numpy.sum
覆盖。
当您计算内置 python sum(range(5),-1)
时,它的计算结果类似于 -1 + sum([0,1,2,3,4])
.
相比之下,numpy.sum
假设 -1
是轴参数,表示输入数组的最后一个(也是唯一的)轴。所以,你有效地得到 np.sum(range(5))
.
应谨慎覆盖内置函数。
import *
可能很危险。
内置 sum
和 numpy
中定义的 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
.
.
.
>>>
这是因为 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.