【问题标题】:Getting `ValueError: array must not contain infs or NaNs` even after using `np.nan_to_num()`获取 `ValueError: array must not contain infs or NaNs` 即使使用 `np.nan_to_num()`
【发布时间】:2020-07-15 07:40:53
【问题描述】:

即使在我使用了np.nan_to_num() 之后,我也收到了这个ValueError: array must not contain infs or NaNs

正如您在下面的代码块中所见,我编写了一个函数,它通过logit 函数将情绪得分置于正态分布中。我最初得到了上面的ValueError,所以我决定尝试在情绪分数上使用np.nan_to_num(),然后将它们输入到pearsonr 函数中。但是,即使在那之后它仍然会产生错误。当我在单独的单元测试中使用 logitnp.nam_to_num() 并打印输出时,没有 inf 或 nan 值(注意:虽然在使用 np.nam_to_num() 之前有一些 infs,但由 logit 函数引起,但它们都在打印的单独单元测试中被成功替换)。我不确定下面的循环中发生了什么。作为参考,new_all_data 只是我用来存储所有各种信息的 pandas 数据框。任何帮助表示赞赏!

from scipy import special, stats
import numpy as np

def logit_correlate(sentiments, percent_changes):
    normalised_sentiments = special.logit(sentiments)
    normalised_sentiments_fixed = np.nan_to_num(normalised_sentiments)
    r, p_value = stats.pearsonr(normalised_sentiments_fixed, percent_changes)
    return r, p_value

for sentiment in ['weighted_sentiments', 'unweighted_sentiments', 'weighted_sentiments_DBSCAN', 'full_mean', 'full_mean_unrounded', 'full_mode']:
    r_1yr, p_value_1yr = logit_correlate(new_all_data[sentiment], new_all_data['% change 1 year'])
    print(f'{sentiment:10} 1 year r={r_1yr:10} p={p_value_1yr:10}')

编辑:我进行了另一项测试以确保我没有失去理智。这是修改后的logit_correlate函数:

def logit_correlate(sentiments, percent_changes):
    normalised_sentiments = special.logit(sentiments)
    normalised_sentiments_fixed = np.nan_to_num(normalised_sentiments)
    print(np.isnan(normalised_sentiments_fixed).any())
    print(np.isinf(normalised_sentiments_fixed).any())
    print(np.isnan(percent_changes.values).any())
    print(np.isinf(percent_changes.values).any())
    r, p_value = stats.pearsonr(normalised_sentiments_fixed, percent_changes)
    return r, p_value

如您所见,我检查以确保 pearson 相关 (pearsonr) 的任一输入数组中都没有 nan 或 inf 值。一切都返回错误。当调用 pearsonr 函数时,函数会中断,logitnp.nan_to_num() 函数都会运行(我也打印了它们的输出以确保)。然而它仍然在提高ValueError

【问题讨论】:

  • 我不确定是不是这个问题,但您在打印出percent_changes.values 时传递了percent_changes
  • 我使用 .values 是因为它是 pandas 系列,我希望打印所有值。但是 pearsonr 函数接受任何类似数组的东西,所以怀疑这就是问题所在。
  • 请包含完整的回溯。 np.nan_to_num 用一些非常大的数字替换无穷大值,因此根据 pearsonr 执行的数学运算,这些大数字可能会导致额外的 infs 出现。检查如果您删除它们或通过 posinf=..., neginf=... 关键字手动设置它们会发生什么。
  • 如果您提供minimal, reproducible example,别人会更容易帮助您。
  • @a_guest np.nan_to_num 肯定会创建一些大数字(e308 和 e-308),也许这些是导致错误的原因,即使它们实际上不是 inf?我可以尝试手动设置谢谢!另外,您能解释一下包含完整回溯的意思吗? @Warren Weckesser 我将尝试使用虚拟数据创建一个可重现的最小示例。

标签: python pandas numpy scipy


【解决方案1】:

np.nan_to_num 用一些非常大的数字替换 inf 值,这可能会在以后导致额外的 infscipy.stats.pearsonr 计算输入数组的 mean,并且由于这些大数的总和超过有效浮点范围,原始数组中已有两个 inf 足以导致额外的 inf

>>> np.nan_to_num(np.array([np.inf, np.inf])).mean()
inf

根据您的需要,您可以通过x[np.isfinite(x)] 完全删除它们,或者使用nan_to_numposinfneginv 关键字参数,以便用更小的值替换inf

【讨论】:

  • 谢谢!这很有意义。如有必要,我可以尝试用较小的值替换它们,再次感谢您
猜你喜欢
  • 2016-11-15
  • 2020-09-16
  • 2020-11-11
  • 2018-07-16
  • 2016-06-20
  • 2019-07-23
  • 2017-12-25
  • 2018-12-23
  • 2022-01-20
相关资源
最近更新 更多