我有一個陣列output和一個 id subject_ids。
output = [[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]]]
subject_ids = [[0, 1], [1, 2], [0, 2]]
ID中的數字分別代表開始和結束位置,然后我想根據開始和結束位置得到它們之間的向量。
舉例來說,我應該得到[[1, 2, 3], [4, 5, 6]]和[[4, 5, 6], [7, 8, 9]]以及[[1, 2, 3], [4, 5, 6], [7, 8, 9]]在這種情況下。
我該怎么辦?我試過tf.slice和tf.gather,但似乎沒有用。
uj5u.com熱心網友回復:
如果您只想使用 Tensorflow,請嘗試tf.gather與tf.range和結合使用tf.ragged.stack:
import tensorflow as tf
output = tf.constant([
[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]
])
subject_ids = tf.constant([[0, 1], [1, 2], [0, 2]])
ragged_ouput = tf.ragged.stack([tf.gather(output, tf.range(subject_ids[i, 0], subject_ids[i, 1] 1)) for i in tf.range(0, tf.shape(subject_ids)[0])], axis=0)
ragged_ouput = tf.squeeze(ragged_ouput, axis=2)
print(ragged_ouput)
[[[1, 2, 3], [4, 5, 6]], [[4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
更新 1:
import tensorflow as tf
tf.config.run_functions_eagerly(True)
output = tf.constant([
[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]
])
subject_ids = tf.constant([[0, 1], [1, 2], [0, 2]])
def slice_tensor(x):
return tf.ragged.stack([tf.gather(output, tf.range(x[0], x[1] 1))], axis=0)
ragged_ouput = tf.map_fn(slice_tensor, subject_ids, fn_output_signature=tf.RaggedTensorSpec(shape=[1, None, None, 3],
dtype=tf.int32,
ragged_rank=2,
row_splits_dtype=tf.int64))
ragged_ouput = tf.squeeze(ragged_ouput, axis=1)
tf.print(ragged_ouput, summarize=-1)
[[[[1, 2, 3]], [[4, 5, 6]]], [[[4, 5, 6]], [[7, 8, 9]]], [[[1, 2, 3]], [[4, 5, 6]], [[7, 8, 9]]]]
uj5u.com熱心網友回復:
剛剛怎么樣
>>> [output[np.arange(x, y 1)] for x, y in subject_ids]
[array([[[1, 2, 3]],
[[4, 5, 6]]]),
array([[[4, 5, 6]],
[[7, 8, 9]]]),
array([[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]])]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402828.html
標籤:
