我正在尝试对众多 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 中?数组中的某些值非常小,小数点后十分位和千分位,下溢或上溢可能成为这里的问题吗?
如果你说的一切都是正确的,那它就不会发生。因此,您认为某些事情是不正确的 :-)
*
只能在被乘数为 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
试试看,告诉我们会发生什么。