以简单的方式用 nan 替换 np 数组的 0 个值

Replacing 0 values of np array with nan in an easy way

原则上 np 数组似乎可以保存 nan 值,但它不喜欢在初始分配后将它们写入?任何人都可以阐明这一点,并可能建议一种比示例 5 中的方法更简单的替换方法吗?

import numpy as np

a = np.array([2,1,0,7])
a[a==0] = -999  # replacing this way with numbers works
print (a)

a = np.array([2,1,np.nan,7])  # allocating an np array with nans works
print (a)

a = np.array([2,1,0,7])
a[a==0] = np.nan   # trying the frist approach with nan instead of a number gives ValueError: cannot convert float NaN to integer

a = np.array([2,1,0,7])
a[2] = np.nan   #  also writing to one specific position does not work: ValueError: cannot convert float NaN to integer
print (a)

# works - but this cant be the way to do it normally?
a = np.array([2,1,0,7])
a = list(a)
for idx, elem in enumerate(a):
    if elem == 0:
        a[idx] = np.nan
a = np.array(a)
print(a)
np.array([2,1,0,7]).dtype
# => dtype('int64')
np.array([2,1,np.nan,7]).dtype
# => dtype('float64')

整数没有 NaN 值; np.nan是一个浮点数,不能放在整型数组中。

roganjosh 虽然比我先找到了解决方案 :P(即在尝试将 np.nan 放入其中之前转换为浮点数组)。经 roganjosh 许可:

a = np.array([2,1,0,7])
a = a.astype(np.float64)
a[a == 0] = np.nan
a
# => array([ 2.,  1., nan,  7.])

转换为 list 的原因在于,与 numpy 数组不同,列表不介意混合元素类型。当您重新转换整数和浮点数的混合列表时,numpy 会假定您需要一个浮点数数组。

如评论中所述,问题是a是int类型,而np.nan是float类型,所以不能直接赋值也不能转换为int,因为它只是为浮点类型定义。

您必须初始化一个浮点数数组才能使切片分配工作:

a = np.array([2,1,0,7], dtype=float)
a[a==0] = np.nan

print(a)
# array([ 2.,  1., nan,  7.])