2016-04-07 3 views
2

Die Operation besteht aus zwei Arrays X und idx von gleicher Länge, wobei die Werte von idx zwischen 0 bis (k-1) mit dem Wert von k variieren können.Wie macht man einen elementweisen konditionalen Indexvergleich in Theano?

Dies ist der allgemeine Python-Code, der dies veranschaulicht.

import numpy as np 

X = np.arange(6) # Just for a sample of elements 
k = 3 
idx = numpy.array([[0, 1, 2, 2, 0, 1]]).T # Can only contain values in [0..(k-1)] 
np.array([X[np.where(idx==i)[0]] for i in range(k)]) 

Beispielausgabe:

array([[0, 4], 
     [1, 5], 
     [2, 3]]) 

Hinweis, dass es tatsächlich ein Grund für mich idx als Matrix darstellt und nicht als Vektor. Es wurde im Rahmen seiner Berechnung auf numpy.zeros((n,1)) initialisiert, wobei n die Größe X.

habe ich versucht, diese

import theano 
import theano.tensor as T 

X = T.vector('X') 
idx = T.vector('idx') 
k = T.scalar() 
c = theano.scan(lambda i: X[T.where(T.eq(idx,i))], sequences=T.arange(k)) 
f = function([X,idx,k],c) 

wie so in Theano implementieren Aber ich erhielt diesen Fehler in Zeile, wo c definiert:

TypeError: Wrong number of inputs for Switch.make_node (got 1((<int8>,)), expected 3) 

Gibt es eine einfache Möglichkeit, dies in Theano zu implementieren?

Antwort

1

Verwenden Sie nonzero() und korrigieren Sie die Abmessungen von idx. Dieser Code

löste das Problem

import theano 
import theano.tensor as T 

X = T.vector('X') 
idx = T.vector('idx') 
k = T.scalar() 
c, updates = theano.scan(lambda i: X[T.eq(idx,i).nonzero()], sequences=T.arange(k)) 
f = function([X,idx,k],c) 

Für das gleiche Beispiel durch die Verwendung von Theano:

import numpy as np 

X = np.arange(6) 
k = 3 
idx = np.array([[0, 1, 2, 2, 0, 1]]).T 

f(X, idx.T[0], k).astype(int) 

Diese die Ausgabe als

array([[0, 4], 
     [1, 5], 
     [2, 3]]) 

gibt Wenn idx definiert als np.array([0, 1, 2, 2, 0, 1]), dann f(X, idx, k) kann stattdessen verwendet werden.

Verwandte Themen