有什么方法可以实现这一点吗?其中,我正在处理的数组由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.nanstd
和np.nanmean
函数来代替np.std
和np.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个。