脾气暴躁:RuntimeWarning:在log1p中遇到无效的值

彼得·D

我在np.log1p期间遇到警告RuntimeWarning: invalid value encountered in log1p,但我不知道为什么。据我所知,输入是正确的。它仅包含float64之间的值-0.5,并0.5与一些NaNs

一个问题是,当我尝试将数组一分为二以查找有问题的条件时,似乎可以将数组的任何子部分传递给它np.log1p而没有任何警告。

结果,很抱歉,我无法弄清楚如何从中生成MWE,而且它太大了,无法共享,但是也许有人可以指出我可以研究的其他调试或调查途径?

首先,这是警告:

z = np.log1p(x)
# /data/anaconda/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in log1p
  """Entry point for launching an IPython kernel.

其他所有触发相同警告的调用:

_ = np.log1p(x.values.copy(order='C'))
_ = np.log1p(np.ravel(x.values))

但是,输入似乎是正确的:

x.info()
# <class 'pandas.core.frame.DataFrame'>
# DatetimeIndex: 4927 entries, 2000-01-03 to 2019-08-02
# Columns: 8119 entries, aaa to zzz
# dtypes: float64(8119)
# memory usage: 305.2 MB

x.values.flags
#   C_CONTIGUOUS : False
#   F_CONTIGUOUS : True
#   OWNDATA : False
#   WRITEABLE : True
#   ALIGNED : True
#   WRITEBACKIFCOPY : False
#   UPDATEIFCOPY : False

(x.min().min(), x.max().max())
# (-0.5, 0.5)

Numpy版本是1.15.4(而Pandas是0.23.4)。

现在,对于奇怪的部分:将数组(此处从末尾开始的20行)分为两部分,没有一个部分得到警告:

z0 = np.log1p(x.values[:-20])
z1 = np.log1p(x.values[-20:])
np.allclose(z, np.concatenate((z0, z1)), equal_nan=True)
# True

但是,虽然串联在一起的两个部分接近于单个调用(z)中获得的结果,但它们并不相同:

np.allclose(z.values, np.concatenate((z0, z1)), equal_nan=True)
# True, but
np.allclose(z.values, np.concatenate((z0, z1)), equal_nan=True, atol=0, rtol=0)
# False

差异很小,但是我不知道采用log(1 + v)单个标量会不时产生不同的结果。

np.nanmax(np.abs(z.values - np.concatenate((z0, z1))))
# 1.1102230246251565e-16

我还应该尝试什么?

特伦顿·麦金尼
  • 没有数据,很难提供这种情况发生的原因。
  • 根据我的原始评论,发布问题时使用的numpy版本不是当前版本。

    • 这样,一种可能的解决方案是将程序包更新为当前版本。
    • 根据OP的评论,截至本文发布时,切换到当前版本1.18.1解决了该错误。
  • 该函数np.log1p1包含一个默认where=True参数,与1.15版本相比,该参数现在似乎略有不同。

1.15其中值为True表示要在该位置计算ufunc,值为False表示将值保留在输出中。

1.18其中此条件通过输入广播。在条件为True的位置,将out数组设置为ufunc结果。在其他地方,out数组将保留其原始值。请注意,如果通过default创建未初始化的out数组out=None,则条件为False的数组中的位置将保持未初始化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章