在数组中使用None/NaN执行numpy操作



有什么方法可以实现这一点吗?其中,我正在处理的数组由None组成,这意味着在处理过程中忽略该值。例如,我想规范化这个数组:

output = np.array([[1,2,None,4,5],[None,7,8,9,10]])
mu = np.mean(output, axis=(0,1), keepdims=True)
sd = np.std(output, axis=(0,1), keepdims=True)
normalized_output = (output - mu)/sd

预期结果:

array([[-1.5666989 , -1.21854359, None, -0.52223297, -0.17407766],
[ None,  0.52223297,  0.87038828,  1.21854359,  1.5666989 ]])

编辑:根据建议,最好使用NaN而不是None。如何使用NaN:

output = np.array([[1,2,np.NAN,4,5],[np.NAN,7,8,9,10]])
mu = np.mean(output, axis=(0,1), keepdims=True)
sd = np.std(output, axis=(0,1), keepdims=True)
normalized_output = (output - mu)/sd
print(normalized_output)
# array([[nan, nan, nan, nan, nan],
#        [nan, nan, nan, nan, nan]])

您可以使用numpy掩码数组进行跳过某些值的计算。

已经存在一个函数来创建屏蔽NaN值的屏蔽数组:ma.masked_invalid

它可以这样使用:

import numpy as np
from numpy import ma

output = ma.masked_invalid([[1,2,np.NAN,4,5],[np.NAN,7,8,9,10]])
mu = np.mean(output, axis=(0,1), keepdims=True)
sd = np.std(output, axis=(0,1), keepdims=True)
normalized_output = (output - mu)/sd
print(normalized_output)

输出(--表示无效值(:

[[-1.5461980716652028 -1.2206826881567392 -- -0.5696519211398116
-0.24413653763134782]
[-- 0.40689422938557973 0.7324096128940435 1.0579249964025073
1.3834403799109711]]

您可以使用np.nanstdnp.nanmean函数来代替np.stdnp.mean

output = np.array([[1,2,np.nan,4,5],[np.nan,7,8,9,10]])
mu = np.nanmean(output, axis=(0,1), keepdims=True)
sd = np.nanstd(output, axis=(0,1), keepdims=True)
normalized_output = (output - mu)/sd

你会得到这样的输出

array([[-1.54619807, -1.22068269,         nan, -0.56965192, -0.24413654],
[        nan,  0.40689423,  0.73240961,  1.057925  ,  1.38344038]])

它与您想要的输出不同,因为np.nanstd忽略了数组中存在的Nan值,所以您有8个元素而不是10个。

最新更新