我在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版本不是当前版本。
该函数np.log1p1
包含一个默认where=True
参数,与1.15版本相比,该参数现在似乎略有不同。
1.15其中:值为True表示要在该位置计算ufunc,值为False表示将值保留在输出中。
1.18其中:此条件通过输入广播。在条件为True的位置,将out数组设置为ufunc结果。在其他地方,out数组将保留其原始值。请注意,如果通过default创建未初始化的out数组out=None
,则条件为False的数组中的位置将保持未初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句