I couldn't find any dedicated function for that purpose, so I simply ended
up using theano.scan
<http://deeplearning.net/software/theano/tutorial/loop.html>:

import theanoimport theano.tensor
from theano import sharedimport numpy as np

y = shared(np.array([2,1]))
x = 
shared(np.arange(24).reshape((2,3,4)))print('x.eval():\n{0}\n'.format(x.eval()))
def shift_and_reverse_row(matrix, y):
    '''
    Shift and reverse the matrix in the direction of the first
dimension (i.e., rows)
    matrix: matrix
    y: scalar
    '''
    new_matrix = theano.tensor.zeros_like(matrix)
    new_matrix = theano.tensor.set_subtensor(new_matrix[:y,:],
matrix[y-1::-1,:])
    return new_matrix

new_x, updates = theano.scan(shift_and_reverse_row, outputs_info=None,
                             sequences=[x, y[::-1]] )
new_x = new_x[:, ::-1, :]print('new_x.eval(): \n{0}'.format(new_x.eval()))

output:

x.eval():[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

new_x.eval():[[[ 0  0  0  0]
  [ 0  0  0  0]
  [ 0  1  2  3]]

 [[ 0  0  0  0]
  [12 13 14 15]
  [16 17 18 19]]]






On 15 August 2016 at 12:23, Franck Dernoncourt <[email protected]
> wrote:

> Hi all,
>
>
> I have a Theano tensor3 (i.e., a 3-dimensional array) x:
>
>
> [[[ 0  1  2  3]
>   [ 4  5  6  7]
>   [ 8  9 10 11]]
>
>  [[12 13 14 15]
>   [16 17 18 19]
>   [20 21 22 23]]]
>
>
> as well as a Theano vector (i.e., a 1-dimensional array) y, which we will
> refer as an "offset" vector, since it specifies the desired offset:
>
> [2, 1]
>
>
> I want to shift the location of elements of x based on vector y, so that
> the output be as follows (the shift is performed on the second dimension):
>
> [[[ a  b  c  d]
>   [ e  f  g  h]
>   [ 0  1  2  3]]
>
>  [[ i  j  k  l]
>   [12 13 14 15]
>   [16 17 18 19]]]
>
> where the a, b, …, l could be any number.
>
>
> For example, a valid output could be:
>
> [[[ 0  0  0  0]
>   [ 0  0  0  0]
>   [ 0  1  2  3]]
>
>  [[ 0  0  0  0]
>   [12 13 14 15]
>   [16 17 18 19]]]
>
>
> Another valid output could be:
>
> [[[ 4  5  6  7]
>   [ 8  9 10 11]
>   [ 0  1  2  3]]
>
>  [[20 21 22 23]
>   [12 13 14 15]
>   [16 17 18 19]]]
>
>
>
>
> ------------------------------
>
>
> I am aware of the function theano.tensor.roll(x, shift, axis=None)
> <http://deeplearning.net/software/theano/library/tensor/basic.html#theano.tensor.roll>,
> however the shift can only take a scalar as input, i.e. it shifts all
> elements with the same offset.
>
>
> E.g., the code:
>
> import theano.tensorfrom theano import sharedimport numpy as np
>
> x = shared(np.arange(24).reshape((2,3,4)))print('theano.tensor.roll(x, 2, 
> axis=1).eval(): \n{0}'.
>       format(theano.tensor.roll(x, 2, axis=1).eval()))
>
>
> outputs:
>
> theano.tensor.roll(x, 2, axis=1).eval():[[[ 4  5  6  7]
>   [ 8  9 10 11]
>   [ 0  1  2  3]]
>
>  [[16 17 18 19]
>   [20 21 22 23]
>   [12 13 14 15]]]
>
>
> which is not what I want.
>
>
> How can I shift the location of tensor3 elements based on an offset
> vector? (note that in the code provided in this example, the tensor3 is a
> shared variable for convenience, but in my actual code it will be a
> symbolic variable)
>
>
> Thanks,
>
> Franck
>
> --
>
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "theano-users" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/theano-users/sl1K1LjZ9QY/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to