【问题标题】:numpy - explanation of numpy.prodnumpy - numpy.prod 的解释
【发布时间】:2021-06-19 03:04:54
【问题描述】:

问题

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

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

np.prod([])
1.0 ```

为什么空数组a = np.empty((1,5), dtype=float) 的乘积是0 而不是1?如果product of empty list/array is 1的定义为真,那我想应该是1。

a = np.empty((1,5), dtype=float)
a.prod()
---
0

背景

对乘积(数组中元素的乘积)是 1,而不是 0 感到困惑。研究了文章,但找不到明确的解释。

math.prod([2, 3, 5]) # = 30
math.prod([2, 3])    # = 6
math.prod([2])       # = 2
math.prod([])        # = 1
(* 2 2 2)   ; evaluates to 8
(* 2 2)     ; evaluates to 4
(* 2)       ; evaluates to 2
(*)         ; evaluates to 1

似乎与范畴论有关,但解释含糊不清,无法理解它试图解释的内容。

您可以在此处找到分类产品的完整定义。以下 我给出的定义省略了当我们查看时会消失的细节 空产品。

一组对象的乘积是一个对象 P 使得给定任意 其他对象 X ...存在从 X 到 P 的唯一态射,使得 ….

如果你以前从未见过这个,你可能会想知道里面有什么 这与产品有关的世界。你必须相信我 这个。

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

【问题讨论】:

标签: numpy cartesian-product


【解决方案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

如果我们改用accumulate,该操作可能会更清晰:

In [177]: np.multiply.accumulate(np.arange(1,6))
Out[177]: array([  1,   2,   6,  24, 120])

基本上np.prodnp.sum 的乘法等价物。

如果您查看np.multiply.reduce 的文档,您会得到对一般ufunc.reduce 方法的描述。它讨论了一个initial 值,它可能是默认值,也可能是用户指定的。所有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,) 以及值的差异。

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多