【问题标题】:Mean of a numpy array returns Nannumpy 数组的平均值返回 Nan
【发布时间】:2020-10-18 11:28:14
【问题描述】:

我有一个np.array,我想计算它的平均值。当我运行我的代码时,这部分代码返回 Nan:

data -= np.mean(data, dtype=np.float64)

有什么问题?

【问题讨论】:

  • 我猜要么数组中有 nan,要么数组为空。
  • @dmuir:我检查了数组,它的一些值是nan。我该怎么办?
  • 您能添加一些示例数据吗?
  • np.nan_to_num(x) 可用于替换 NaN 值。
  • @mpSchrader 我添加了这段代码并将值改为0而不是nan。但是这次执行代码后(data -= np.mean(data)),np.mean返回无限.什么问题?

标签: python numpy tensorflow matplotlib math


【解决方案1】:

因为数字和 NaN 之间的任何运算都返回 NaN,所以如果 data 数组包含至少一个 NaN,np.mean 运算将返回 NaN。您可以使用np.nanmean 函数计算平均值(检查NumPy's documentation):

data -= np.nanmean(data, dtype=np.float64)

编辑:对于同时包含 NaN 和 Inf 值的数组

如果您的数组还包含 Inf 值,则需要在不考虑这两个值的情况下计算平均值。

>>> import numpy as np
>>> x = np.array([np.nan, np.inf, 1])
>>> np.mean(x)
nan
>>> np.nanmean(x)
inf
>>> np.nanmean(x[x ~= np.isinf(x)])
1.0

或者,您可以使用np.nan_to_num 将数组转换为值,您可以在其中决定哪些值可以替换NaN、+Inf 和-Inf 值as specified in the doc,以便之后每个常规函数都可以工作。例如,在您的情况下,如果您想同时丢弃 Inf 和 NaN,您可以将每个“坏”值转换为 NaN,并在结果数组上应用 np.nanmean

>>> import numpy as np
>>> x = np.array([np.nan, np.inf, 1])
>>> y = np.nan_to_num(x, nan=np.nan, posinf=np.nan)
>>> y
array([nan, nan,  1.])
>>> y_mean = np.nanmean(y)
>>> y_mean
1.0

【讨论】:

  • 我这样做了,但它返回了一个无限的 .问题出在哪里?
  • 您的数组也可能包含无限值。在这种情况下,您肯定要忽略它们。我编辑了我的答案。
  • 我检查了我的数据,它没有无限值,但执行代码后,它返回无限。我该怎么办
  • 好吧,你能分享你的数据(或你的数据子集)吗? np.minnp.max 返回什么?当你绘制它时你会看到什么?
【解决方案2】:

您的数组中很可能有NaNs

您可以选择所有其他不是NaN 的元素,例如:

my_array = my_array[~np.isnan(my_array)]

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 2014-05-02
    • 2016-04-09
    • 2011-10-07
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2011-07-25
    • 2015-07-09
    相关资源
    最近更新 更多