tf.boolean_mask()
действительно возвращает 1-D тензор, так как в противном случае результирующий тензор с сохраненными размерами будет разреженным (ср. Столбцы с другим числом положительных элементов).
КакЯ не знаю ни одной медианной функции для разреженных матриц, единственная альтернатива, которая приходит на ум, - это циклически проходить по столбцам, например, используя tf.map_fn()
:
import tensorflow as tf
A = tf.convert_to_tensor([[ 1, 0, 20, 5],
[-1, 1, 10, 0],
[-2, 1, -10, 2],
[ 0, 2, 20, 1]])
positive_median_fn = lambda x: tf.contrib.distributions.percentile(tf.boolean_mask(x, tf.greater(x, 0)), q=50)
A_t = tf.matrix_transpose(A) # tf.map_fn is applied along 1st dim, so we need to transpose A
res = tf.map_fn(fn=positive_median_fn, elems=A_t)
with tf.Session() as sess:
print(sess.run(res))
# [ 1 1 20 2]
Примечание: этот фрагмент не охватывает случай, когда столбец не содержит положительных элементов.tf.contrib.distributions.percentile()
вернет ошибку, если его входной тензор пуст.Например, можно использовать условие в форме tf.boolean_mask(x, tf.greater(x, 0))
(например, с tf.where()
)