【问题标题】:Why is the mean smaller than the minimum and why does this change with 64bit floats?为什么平均值小于最小值,为什么这会随着 64 位浮点数而变化?
【发布时间】:2014-05-23 17:08:12
【问题描述】:

我有一个输入数组,它是一个掩码数组。
当我检查平均值时,我得到一个无意义的数字:小于报告的最小值!

所以,原始数组:numpy.mean(A) < numpy.min(A)。注意A.dtype 返回float32

修复:A3=A.astype(float)。 A3 仍然是一个掩码数组,但现在平均值介于最小值和最大值之间,所以我相信它是正确的!现在由于某种原因A3.dtypefloat64。为什么??为什么会改变它,为什么它在 64 位是正确的,而在 32 位是完全错误的?

谁能解释为什么我需要重铸数组以准确计算平均值? (事实证明,无论有没有 numpy)。

编辑:我使用的是 64 位系统,所以是的,这就是重铸将其更改为 64 位的原因。事实证明,如果我对数据进行子集化(使用 netCDF4 Dataset 从 netCDF 输入中提取),我没有遇到这个问题,较小的数组不会产生这个问题 - 因此它是由溢出引起的,所以切换到 64 位可以防止这个问题。
所以我仍然不清楚为什么它最初会加载为 float32,但我想它旨在节省空间,即使它是 64 位系统。数组本身是1872x128x256,非屏蔽值在 300 左右,结果足以导致溢出 :)

【问题讨论】:

  • 请展示一个实际的代码示例来说明问题。
  • numpy 数组与 Python 数组完全不同,我假设您的意思是前者?
  • 如果您在 64 位系统上,A.astype(float) 将返回一个 np.float64 数组。
  • 我最终想通了,将编辑帖子。没有添加代码或数组类型,因为我想保持其通用性,而不是将 NetCDF 带入其中 :)
  • @ebarr 你是对的,系统是 64 位的事实是关键,它迫使它达到首选精度,而不是要求的最低精度。

标签: python arrays numpy floating-accuracy floating-point-conversion


【解决方案1】:

如果您使用的是大型数组,请注意潜在的溢出问题!!
在这种情况下,从 32 位浮点数更改为 64 位浮点数可避免(据我所知未标记)导致异常 mean 计算的溢出。

【讨论】:

猜你喜欢
  • 2021-08-22
  • 2017-06-22
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多