将nan值转换为多个数组的指定值的好方法

时间:2014-04-27 05:59:55

标签: python arrays numpy nan

在我真正的问题中,我有数百个数据数组和结果数组,所以我不能手动完成。

import numpy as np

data1 = np.array([1,2,np.nan,4,5,6,7],dtype=float)
data2 = np.array([11,np.nan,9,4,5,6,71],dtype=float)
data3 = np.array([17,np.nan,13,4,15,6,17],dtype=float)

my_groups = ['result1', 'result2', 'result3']

result1 = data1/data2
result2 = data1/data3
result3 = data3/data2

对于每个结果,我想将np.nan值转换为-9.0: 最长的写作方式是:

result1 = np.where(np.isnan(result1),-9.0,result1)
result2 = np.where(np.isnan(result2),-9.0,result2)
result3 = np.where(np.isnan(result3),-9.0,result3)

但是,我想缩短脚本。这样做的好方法是什么?

for i in my_groups:
    out[i] = np.where(np.isnan(i),-9.0,i)

当然我的代码错了。等待你的想法。

1 个答案:

答案 0 :(得分:2)

只需在任何阵列上使用掩码X

X[np.isnan(X)] = -9.0

这正是numpy在类似函数nan_to_num中所做的,它用零替换nan和有限数字inf。如果你的数据"数组大小都相同,只需使用2D数组就可以一举完成。例如:

import numpy as np

data = np.array([[1,2,np.nan,4,5,6,7],
                 [11,np.nan,9,4,5,6,71],
                 [17,np.nan,13,4,15,6,17]])

result = np.array([data[0]/data[1],
                   data[0]/data[2],
                   data[2]/data[1]])

result[np.isnan(result)] = -9
print result

>> [[ 0.09090909 -9.         -9.          1.          1.          1.       0.09859155]
    [ 0.05882353 -9.         -9.          1.          0.33333333  1.       0.41176471]
    [ 1.54545455 -9.          1.44444444  1.          3.          1.       0.23943662]]