首页 > 解决方案 > Numpy:RuntimeWarning:log1p中遇到无效值

问题描述

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

一个问题是,当我尝试平分我的数组以找到违规条件时,看起来数组的任何子部分都可以在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

我还应该尝试什么?

标签: pythonpandasnumpy

解决方案


  • 没有数据,很难提供发生这种情况的原因。
  • 根据我的原始评论,发布问题时使用的 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 的位置将保持未初始化。


推荐阅读