So in das Fehlen einer Antwort, habe ich beschlossen, die rechenintensive Lösung zu verwenden, die die die Indizes Tensoren sowohl meine Daten entfaltet, das Hinzufügen einer der Indizes versetzt sie global zu bringen Positionen, Indizierung der Daten und Umgestaltung des Originals.
Ich füge hier meinen Testcode hinzu, einschließlich einer (auskommentierten) Lösung für Matrizen.
def theano_convertion(els, inds, offsets):
els = T.flatten(els)
inds = T.flatten(inds) + offsets
return T.reshape(els[inds], (2, 3, 16, 5))
if __name__ == '__main__':
# command: np.transpose(t[range(2), indices])
# t = np.random.randint(0, 10, (2, 20))
# indices = np.random.randint(0, 10, (5, 2))
t = np.random.randint(0, 10, (2, 3, 16, 20)).astype('int32')
indices = np.random.randint(0, 10, (2, 3, 16, 5)).astype('int32')
offsets = np.asarray(range(1, 2 * 3 * 16 + 1), dtype='int32')
offsets = (offsets * 20) - 20
offsets = np.repeat(offsets, 5)
offsets_tens = T.ivector('offsets')
inds_tens = T.itensor4('inds')
t_tens = T.itensor4('t')
func = theano.function(
[t_tens, inds_tens, offsets_tens],
[theano_convertion(t_tens, inds_tens, offsets_tens)]
)
shaped_elements = []
flattened_elements = []
[tmp] = func(t, indices, offsets)
for i in range(2):
for j in range(3):
for k in range(16):
shaped_elements.append(t[i, j, k, indices[i, j, k, :]])
flattened_elements.append(tmp[i, j, k, :])
print shaped_elements[-1] == flattened_elements[-1]
Enthält 'maske' 1D-Indizes oder 4D-Indizes? Ich meine, 'i = mask [0,0,0,0]' ist ein Integer 'i <1 * 700 * 16 * 95000' oder indexiert nur die letzte Dimension' [0,0,0, i] '? –
Nur Indizes für die letzte Dimension. Also ist jedes Element in der 4. Dimension der Maske ein Index, den ich von der 4. Dimension des Tensors haben möchte. Ich könnte die Maske anders erstellen, wenn es das Problem einfacher macht. (Die Maske wird mit numpy erzeugt, außerhalb des Berechnungsgraphen, auf der CPU => vollständige Freiheit) –