Gegeben ...eleganter Weg,
- eine Matrix
A
der Form[m, n]
- ein Tensor
I
der Form[m]
ich eine Liste erhalten möchten J
von Elementen aus A
, wobei J[i] = A[i, I[i]]
.
Das heißt, I
enthält den Index des Elements zur Auswahl aus jeder Zeile in A
.
Kontext: Ich habe bereits die argmax(A, 1)
und jetzt möchte ich auch die max
. Ich weiß, dass ich einfach reduce_max
verwenden kann. Und nach ein wenig versucht, um kam ich auch mit diesem nach oben:
J = tf.gather_nd(A,
tf.transpose(tf.pack([tf.to_int64(tf.range(A.get_shape()[0])), I])))
Wo die to_int64
benötigt wird, weil Bereich produziert nur int32
und argmax
produziert nur int64
.
Keines der beiden kommt mir besonders elegant vor. Man hat Laufzeit Overhead (wahrscheinlich über den Faktor n
) und der andere hat einen unbekannten Faktor kognitiven Overhead. Fehle ich hier etwas?
Sie können die Liste 'ind = [[1, I [1]], [2, I [2]], ...] erstellen, indem Sie' tf.range', 'tf.pack' und' tf verwenden .transpose ', und dann' tf.gather_nd (J, ind) ' –
@YaroslavBulatov ist das nicht genau das, was ich beschrieben habe? –
aber ich denke, das würde bedeuten, das ist nur der Weg zu gehen? –