Numpy 数组乘法导致某些值是 inf,即使原始数组都是有效的浮点数

问题描述 投票:0回答:1

我正在尝试对众多 numpy 数组执行元素明智的乘法。

执行:-

mult = np.ones(len(single_arrays[0]))
for i in range(len(single_arrays)):
    mult *= single_arrays[i]

每个单个数组中的大多数值都在 0 和 1 之间(有些值大于 1),二维“single_arrays”大约有 700 个单独的数组。

结果数组“mult”有很多“inf”值和一个“nan”值,即使“single_arrays”中没有数组有“inf”或“nan”值,所有值都是有效的浮点数。

为什么这个问题出现在 mult 中?数组中的某些值非常小,小数点后十分位和千分位,下溢或上溢可能成为这里的问题吗?

python arrays numpy numpy-ndarray
1个回答
0
投票

如果你说的一切都是正确的,那它就不会发生。因此,您认为某些事情是不正确的 :-)

*
只能在被乘数为 inf 或乘积非常大时提供无穷大。但如果“每个单个数组中的所有值都在 0 和 1 之间”是真的,它就不会很大。那么没有产品可以大于 1.0.

*
只能在被乘数为 NaN 时提供 NaN,或者您尝试(以任一顺序)乘以 inf 和零。你说你从来没有做过。

下溢当然是可能的,但无关紧要 - 除非你除以零或非常小的数字(接近 0,在非正规范围内),否则微小的数字不能产生 inf。

所以添加打印以找出实际发生的事情。选择一个索引

j
mult[j]
以 inf 结尾,然后更改代码以显示它的来源:

for i in range(len(single_arrays)):
    orig = mult[j]
    mult *= single_arrays[i]
    if mult[j] == inf:
        print("got an inf in mult[j]",
              "as the product of",
              orig, "and", single_arrays[i][j])
        assert False  # just a way to raise an exception

试试看,告诉我们会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.