这可能是一个基本问题,但我找不到解决方案:我需要计算Tensor的平均值忽略任何非有限值。例如,mean([2.0, 3.0, inf, 5.0])应该返回3.333,而不是inf或2.5。我尝试了sess.run(tf.reduce_mean([2.0, 3.0, inf, 5.0])),但它返回inf。
mean([2.0, 3.0, inf, 5.0])
3.333
inf
2.5
sess.run(tf.reduce_mean([2.0, 3.0, inf, 5.0]))
qojgxg4l1#
您可以使用is_finite和boolean_mask的组合。
is_finite
boolean_mask
import tensorflow as tf x = tf.constant([2, 3, float('Inf'), 5]) mymean = tf.reduce_mean(tf.boolean_mask(x, tf.is_finite(x))) sess = tf.Session() sess.run(mymean)
请注意,is_finite也将删除NaN值。
NaN
cmssoen22#
给出的答案几乎是正确的。问题是关于忽略 * 非有限 * 值,答案是只忽略 * 无限 * 值。他们不是一回事,特别是关于 nan。要实际忽略任何非有限值(包括nan),请使用以下稍微简单的行:
mymean = tf.reduce_mean(tf.boolean_mask(x, tf.is_finite(x))
uemypmqf3#
公认的答案对于完全约简很有效,但是,如果只想在某些轴上使用reduce_mean,则需要更复杂的方法:
def reduce_nanmean(tensor, axis=None): mask = tf.math.is_finite(tensor) numerator = tf.reduce_sum(tf.where(mask, tensor, tf.zeros_like(tensor)), axis=axis) denominator = tf.reduce_sum(tf.cast(mask, dtype=tf.float32), axis=axis) return numerator / denominator
为了获得分子,函数在对Tensor中的数字求和之前将非有限数字(NaN,Inf)替换为零。为了得到分母(即有限数的个数),它对一个布尔掩码求和,这个掩码屏蔽了非有限数。
3条答案
按热度按时间qojgxg4l1#
您可以使用
is_finite
和boolean_mask
的组合。请注意,
is_finite
也将删除NaN
值。cmssoen22#
给出的答案几乎是正确的。问题是关于忽略 * 非有限 * 值,答案是只忽略 * 无限 * 值。他们不是一回事,特别是关于 nan。
要实际忽略任何非有限值(包括nan),请使用以下稍微简单的行:
uemypmqf3#
公认的答案对于完全约简很有效,但是,如果只想在某些轴上使用reduce_mean,则需要更复杂的方法:
为了获得分子,函数在对Tensor中的数字求和之前将非有限数字(NaN,Inf)替换为零。为了得到分母(即有限数的个数),它对一个布尔掩码求和,这个掩码屏蔽了非有限数。