python - 你如何计算二维张量的每一行的掩码平均值?
问题描述
我有一个像这样的二维张量:
[[1. 0. 0. 2. 1. 0. 1.]
[0. 0. 0. 1. 0. 0. 0.]
[2. 0. 2. 1. 1. 3. 0.]]
我想计算每一行中每个非零元素的平均值,所以结果是:
[1.25 1. 1.8 ]
我如何使用 TensorFlow 做到这一点?
解决方案
计算每行掩码均值的一种方法是使用tf.math.unsorted_segment_mean
. 本质上,您可以每行有一个段 id,然后用一个额外的替换屏蔽元素的段 id。
import tensorflow as tf
with tf.Graph().as_default(), tf.Session() as sess:
x = tf.constant([[1., 0., 0., 2., 1., 0., 1.],
[0., 0., 0., 1., 0., 0., 0.],
[2., 0., 2., 1., 1., 3., 0.]], tf.float32)
s = tf.shape(x)
num_rows = s[0]
num_cols = s[1]
# Mask for selected elements
mask = tf.not_equal(x, 0)
# Make per-row ids
row_id = tf.tile(tf.expand_dims(tf.range(num_rows), 1), [1, num_cols])
# Id is replaced for masked elements
seg_id = tf.where(mask, row_id, num_rows * tf.ones_like(row_id))
# Take segmented mean discarding last value (mean of masked elements)
out = tf.math.unsorted_segment_mean(tf.reshape(x, [-1]), tf.reshape(seg_id, [-1]),
num_rows + 1)[:-1]
print(sess.run(out))
# [1.25 1. 1.8 ]
但是,由于在这种情况下,掩码恰好适用于非零元素,因此您也可以只使用tf.math.count_nonzero
:
import tensorflow as tf
with tf.Graph().as_default(), tf.Session() as sess:
x = tf.constant([[1., 0., 0., 2., 1., 0., 1.],
[0., 0., 0., 1., 0., 0., 0.],
[2., 0., 2., 1., 1., 3., 0.]], tf.float32)
x_sum = tf.reduce_sum(x, axis=1)
x_count = tf.cast(tf.count_nonzero(x, axis=1), x.dtype)
# Using maximum avoids problems when all elements are zero
out = x_sum / tf.maximum(x_count, 1)
print(sess.run(out))
# [1.25 1. 1.8 ]
推荐阅读
- android - ClassCastException - 怎么办?
- c++ - 为什么 std::string append 在 rval ref 上没有重载?
- reactjs - 在回调中延迟访问 React 上下文
- android - 未找到运行应用默认活动时出错
- python - 将图像的 3D numpy 数组堆栈重塑为向量并返回 3D,保留图像结构
- ios - Passport 系列实时输入验证:带有正则表达式问题的 NSPredicate
- azure-active-directory - Azure AD 中自定义 API 的托管标识的开发人员支持
- r - 用多个结果重塑数据
- python - 搜索关键字而不考虑数据框中的特殊字符
- python-3.x - 我正在尝试从头开始在 python 中构建 BST RecursionError:比较中超出了最大递归深度