numpy-解释numpy.prod 问题:

numpy-解释numpy.prod 问题:,numpy,cartesian-product,Numpy,Cartesian Product,请建议我如何理解空列表/数组的乘积为1以及numpy.prod的行为。任何好的阅读,文章到目前为止,我找不到任何(如在底部) 空数组的乘积是中性元素1 np.prod([]) 1.0 ``` 为什么空数组的乘积a=np.empty((1,5),dtype=float)是0而不是1?如果空列表/数组的定义乘积为1为真,那么我认为它应该为1 a = np.empty((1,5), dtype=float) a.prod() --- 0 背景 搞不清楚为什么乘积(数组中元素的乘法)是1,而不

请建议我如何理解空列表/数组的乘积为1以及numpy.prod的行为。任何好的阅读,文章到目前为止,我找不到任何(如在底部)

空数组的乘积是中性元素1

np.prod([])
1.0 ```
为什么空数组的乘积
a=np.empty((1,5),dtype=float)
0
而不是
1
?如果空列表/数组的定义
乘积为1
为真,那么我认为它应该为1

a = np.empty((1,5), dtype=float)
a.prod()
---
0
背景 搞不清楚为什么乘积(数组中元素的乘法)是
1
,而不是
0
。对文章进行了研究,但找不到明确的解释

它似乎与范畴理论有关,但解释含糊不清,无法理解它试图解释什么

你可以在这里找到分类产品的完整定义。在下面 我给出的定义忽略了当我们看到 空产品

一组对象的乘积是一个对象p,因此给定 另一个物体X…存在一个从X到P的唯一态射,这样

如果你以前从未见过这一点,你可能会理直气壮地想知道到底发生了什么 这个世界与产品有关。你得相信我 这个

当对象集为空时,定义中缺少的部分 上面的内容无关紧要,所以我们只能要求 从每个对象X到另一个对象的乘积P的唯一态射 换句话说,P是一个终端对象,通常表示为1。所以在范畴论中, 你可以说空产品是1


np.prod
的代码为:

return _wrapreduction(a, np.multiply, 'prod', axis, dtype, out,
                      keepdims=keepdims, initial=initial, where=where)
换句话说,它只是:

In [176]: np.multiply.reduce(np.arange(1,6))
Out[176]: 120
如果我们使用
acculate
替代,则该操作可能更清晰:

In [177]: np.multiply.accumulate(np.arange(1,6))
Out[177]: array([  1,   2,   6,  24, 120])
基本上,
np.prod
np.sum
的乘法等价物

如果您查看
np.multiply.reduce
的文档,您将得到一般
ufunc.reduce
方法的描述。它讨论的是一个
初始值,它可能是默认值,也可能是用户指定的。所有的
reduce
操作都必须从某种东西开始,最好是从上下文中有意义的东西开始。当参数为空-0值时,该初始值将应用

In [181]: np.multiply.reduce(np.arange(1,6),initial=10)
Out[181]: 1200
In [182]: np.multiply.reduce(np.arange(1,6),initial=0)
Out[182]: 0
请注意,我必须在1时启动
arange
。如果参数中有任何0,则
prod
将为0

In [184]: np.multiply.reduce([],initial=0)
Out[184]: 0.0
In [185]: np.multiply.reduce([],initial=1)
Out[185]: 1.0
In [186]: np.multiply.reduce([],initial=10)
Out[186]: 10.0
至于你对
np.empty
函数的混淆,你有没有费心去看
a

In [187]: np.empty((1,5), float)
Out[187]: array([[4.9e-324, 9.9e-324, 1.5e-323, 2.0e-323, 2.5e-323]])
In [188]: np.array([])
Out[188]: array([], dtype=float64)

np.empty
不会产生与
np.array([])
相同的结果。请注意形状((1,5)与(0,)以及值的差异。

np.prod的代码为:

return _wrapreduction(a, np.multiply, 'prod', axis, dtype, out,
                      keepdims=keepdims, initial=initial, where=where)
换句话说,它只是:

In [176]: np.multiply.reduce(np.arange(1,6))
Out[176]: 120
如果我们使用
acculate
替代,则该操作可能更清晰:

In [177]: np.multiply.accumulate(np.arange(1,6))
Out[177]: array([  1,   2,   6,  24, 120])
基本上,
np.prod
np.sum
的乘法等价物

如果你看一下
np.multiply.reduce
的文档,你会得到一般
ufunc.reduce
方法的描述。它讨论的是
初始值,它可能是默认值,也可能是用户特定的值。所有
reduce
操作都必须从某个地方开始,最好是从上下文中有意义的地方开始。当参数为空-0值时,该初始值将应用

In [181]: np.multiply.reduce(np.arange(1,6),initial=10)
Out[181]: 1200
In [182]: np.multiply.reduce(np.arange(1,6),initial=0)
Out[182]: 0
请注意,我必须在1处启动
arange
。如果参数中有任何0,则
prod
将为0

In [184]: np.multiply.reduce([],initial=0)
Out[184]: 0.0
In [185]: np.multiply.reduce([],initial=1)
Out[185]: 1.0
In [186]: np.multiply.reduce([],initial=10)
Out[186]: 10.0
至于你对
np.empty
函数的混淆,你有没有费心去看
a

In [187]: np.empty((1,5), float)
Out[187]: array([[4.9e-324, 9.9e-324, 1.5e-323, 2.0e-323, 2.5e-323]])
In [188]: np.array([])
Out[188]: array([], dtype=float64)

np.empty
不会产生与
np.array([])
相同的结果。请注意形状((1,5)与(0,)以及值方面的差异。

原因是,
np.empty
不是空数组,而是具有未初始化值的数组。您可以使用例如
print(np.empty(1,5),dtype=float)进行检查
为什么一个空产品产生1,这个问题在这里问得更好:原因是,
np.empty
不是一个空数组,而是一个具有未初始化值的数组,根据。您可以检查例如
print(np.empty(1,5),dtype=float)
为什么一个空产品产生1,这个问题在这里问得更好: