Если у вас есть 2D RaggedTensor, то вы можете получить поведение (3) с помощью:
def get_column_slice_v3(rt, column):
assert column >= 0 # Negative column index not supported
slice = rt[:, column:column+1]
return slice.flat_values
И вы можете получить поведение (1), добавив утверждение, что rt.nrows () == tf.size (slice.flat_values):
def get_column_slice_v1(rt, column):
assert column >= 0 # Negative column index not supported
slice = rt[:, column:column+1]
with tf.assert_equal(rt.nrows(), tf.size(slice.flat_values):
return tf.identity(slice.flat_values)
Чтобы получить поведение (2), я думаю, что самый простой способ - это, вероятно, объединить вектор значений по умолчанию, а затем снова нарезать:
def get_colum_slice_v2(rt, column, default=None):
assert column >= 0 # Negative column index not supported
slice = rt[:, column:column+1]
if default is None:
defaults = tf.zeros([slice.nrows(), 1], slice.dtype)
ele:
defaults = tf.fill([slice.nrows(), 1], default)
slice_plus_default = tf.concat([rt, defaults], axis=1)
slice2 = slice_plus_defaults[:1]
return slice2.flat_values
Можно расширить их для поддержки многомерных рваных тензоров, но логика становится немного более сложной.Также должно быть возможно расширить их для поддержки отрицательных индексов столбцов.