Python 用nan轻松替换np数组的0值

Python 用nan轻松替换np数组的0值,python,numpy,nan,Python,Numpy,Nan,原则上,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 wor

原则上,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)
整数没有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数组不同,list不介意混合元素类型。当您重新转换整数和浮点的混合列表时,numpy将假定您需要一个浮点数组

整数没有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数组不同,list不介意混合元素类型。当您重新转换整数和浮点的混合列表时,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.])

如注释中所述,问题在于a的类型为
int
,而
np.nan
的类型为float,因此不能直接赋值或强制转换为int,因为它仅为float类型定义

要使切片分配正常工作,您必须初始化一个浮点数组:

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

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

这个错误很明显。问题是
a
的类型为
int
,而
np.nan
的类型为
float
,因此它不能直接赋值或强制转换为int,因为它只为float类型定义
a=a.astype(np.float64);a[a==0]=np.nan
错误非常明显。问题是
a
的类型为
int
,而
np.nan
的类型为
float
,因此它不能直接赋值或强制转换为int,因为它只为float类型定义
a=a.astype(np.float64);a[a==0]=np.nan
tbf,我首先用整数重复了这个错误:)只要加上你的答案,他们可能会用他们的例子侥幸逃脱,甚至更少。bf,我首先用整数重复了这个错误:)只要加上你的答案,他们可能会用自己的例子侥幸逃脱,甚至更少