gpt4 book ai didi

python - Numpy 确实对待 float ('nan' ) 并且 float 不同 - 转换为 None

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:50 24 4
gpt4 key购买 nike

我想从普通数组创建一个 Numpy 数组并将 nan 值转换为 None - 但成功取决于天气第一个值是“普通” float ,或 float('nan')

这是我的代码,从初始数组开始:

print(a)
array('d', [3.2345, nan, 2.0, 3.2, 1.0, 3.0])
print(b)
array('d', [nan, nan, 2.0, 3.2, 1.0, 3.0])

现在我想通过向量化函数将所有 nan 值交换为 Python None:

def convert(x):
if x != x:
return None
else:
return x

convert_vec = numpy.vectorize(convert)

很简单,但会导致两种不同的结果:

numpy.asarray(convert_vec(a))

array([[ 3.2345, 2. , 1. ], [ nan, 3.2 , 3. ]])

numpy.asarray(convert_vec(b))
array([[None, 2.0, 1.0], [None, 3.2, 3.0]], dtype=object)

这是为什么?是的,我可以看到一个小区别 - 第二个将 object 作为 dtype。但是使用 numpy.asarray(convert_vec(a), dtype=object) 修复了它 - 两者都有 object 作为 dtype - 但它没有改变结果的差异。

最佳答案

np.nan 是一个浮点值,None 不是数字。

In [464]: np.array([1,2,np.nan,3])
Out[464]: array([ 1., 2., nan, 3.])

In [465]: np.array([1,2,None,3])
Out[465]: array([1, 2, None, 3], dtype=object)

In [466]: np.array([1,2,None,3],dtype=float)
Out[466]: array([ 1., 2., nan, 3.])

如果您尝试创建一个包含None 的数组,结果将是一个dtype=object 数组。如果您坚持使用 float dtype,则 None 将转换为 nan

vectorize 的情况下,如果您没有指定返回数据类型,它会从第一个元素推导出来。

你的例子有点困惑(你需要编辑它们),但我认为

convert(np.nan) => None
convert(123) => 123

所以

convert_vec([123,nan,...]) => [123, nan, ...],dtype=float
convert_vec([nan,123,...]) => [None, 123,...],dtype=object
  • 尝试将 np.nan 转换为 None 是个坏主意,除非可能出于显示目的。

  • vectorize 没有明确的结果数据类型规范是个坏主意

  • 这可能不是 vectorize 的良好用法。

这是转换 nan 值的另一种方法:

In [467]: a=np.array([1,2,np.nan,34,np.nan],float)    
In [468]: a
Out[468]: array([ 1., 2., nan, 34., nan])
In [471]: ind=a!=a
In [472]: ind
Out[472]: array([False, False, True, False, True], dtype=bool)

In [473]: a[ind]=0 # not trying None
In [474]: a
Out[474]: array([ 1., 2., 0., 34., 0.])

或者使用掩码数组:

In [477]: am=np.ma.masked_invalid(a)

In [478]: am
Out[478]:
masked_array(data = [1.0 2.0 -- 34.0 --],
mask = [False False True False True],
fill_value = 1e+20)

In [479]: am.filled(0)
Out[479]: array([ 1., 2., 0., 34., 0.])

关于python - Numpy 确实对待 float ('nan' ) 并且 float 不同 - 转换为 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35323032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com