用-9999.0替换None和Nan栅格值,并将所有值除以1000

时间:2015-06-08 02:00:57

标签: python arrays numpy

我试图用-9999.0替换numpy数组中的所有None和/或nan值,然后将所有数组值除以1000.我的所有尝试都遇到错误,TypeError:只有length-1数组可以转换为Python标量。请帮忙。

__init__.py

2 个答案:

答案 0 :(得分:1)

由于您的stats数组显然包含NaNNone值,因此您的数组dtype将为np.object。可能最简单的方法是迭代数组并创建一个新数组,替换进程中的值。例如:

>>> stats = [1, 2, 3, np.nan, None, 6]
>>> a = np.array([-9999 if x is None or np.isnan(x) else x for x in stats])
>>> a
array([    1,     2,     3, -9999, -9999,     6])

更简单,您可以将dtype设置为np.float,这会隐式地将None转换为np.nan

>>> stats = np.array(stats, dtype=np.float)
>>> stats[np.isnan(stats)] = -9999

但您可能需要考虑使用masked arrays代替:

>>> stats = [1, 2, 3, np.nan, None, 6]
>>> stats = np.array(stats, dtype=np.float)
>>> stats
array([  1.,   2.,   3.,  nan,  nan,   6.])
>>> a = np.ma.array(stats, mask=np.isnan(stats), fill_value=-9999)
>>> a / 1000
masked_array(data = data = [0.001 0.002 0.003 -- -- 0.006],
             mask = [False False False  True  True, False],
             fill_value = -9999.0)

答案 1 :(得分:1)

此代码在数组中查找非浮点数(在本例中为None)的所有值,并将它们替换为-9999。最后一步是将所有内容除以1000:

array = np.array([None, 1.1, 2.1, 3.3, 4.5, None, 5.1, 6.0])
idxs = np.where([type(val) != float for val in array])[0]
array[idxs] = -9999
array = array/1000

我相信您可以根据自己的需求调整此解决方案。