Edit : 

After reading Pascal's response, a quick fix it to use the .clip() function 
to avoid edge cases. 

Instead of : 
    b = q[:, 0]                            
    c = q[:, 1]     

You write : 

   b = q[:, 0].clip(3, n-3)  
   c = q[:, 1].clip(3, n-3)  


On Thursday, November 17, 2016 at 8:20:57 PM UTC-5, VM wrote:
>
> I'm trying to slice a 2D array using coordinates given by another array. 
>
> Example : 
>
> def example(p, Q):                                               
>     a = T.tensor4('a')                                            
>     q = T.matrix('q')                                             
>                                                                   
>     b = q[:, 0]                                                   
>     c = q[:, 1]                                                   
>                                                                   
>     b_i = T.cast(b, 'int32')                                      
>     c_i = T.cast(c, 'int32')                                      
>                                                                   
>     d, _ = theano.map(lambda pix, x, y : pix[0, x-1:x+2, y-1:y+2],
>         sequences=[a, b_i, c_i])                                  
>                                                                   
>                                                                  
>     f = theano.function([a, q], d, allow_input_downcast=True)     
>     return f(p, Q)                                           
>
> # test 
> p = np.arange(200).reshape((2, 1, 10, 10))
> Q = np.array([[3, 4], [5, 6]])            
> print p                                   
> answer = example(p, Q)                                     
> print answer                              
> =========================================
> Gives : 
> [[[[  0   1   2   3   4   5   6   7   8   9]
>    [ 10  11  12  13  14  15  16  17  18  19]
>    [ 20  21  22  23  24  25  26  27  28  29]
>    [ 30  31  32  33  34  35  36  37  38  39]
>    [ 40  41  42  43  44  45  46  47  48  49]
>    [ 50  51  52  53  54  55  56  57  58  59]
>    [ 60  61  62  63  64  65  66  67  68  69]
>    [ 70  71  72  73  74  75  76  77  78  79]
>    [ 80  81  82  83  84  85  86  87  88  89]
>    [ 90  91  92  93  94  95  96  97  98  99]]]
>
>
>  [[[100 101 102 103 104 105 106 107 108 109]
>    [110 111 112 113 114 115 116 117 118 119]
>    [120 121 122 123 124 125 126 127 128 129]
>    [130 131 132 133 134 135 136 137 138 139]
>    [140 141 142 143 144 145 146 147 148 149]
>    [150 151 152 153 154 155 156 157 158 159]
>    [160 161 162 163 164 165 166 167 168 169]
>    [170 171 172 173 174 175 176 177 178 179]
>    [180 181 182 183 184 185 186 187 188 189]
>    [190 191 192 193 194 195 196 197 198 199]]]]
> [[[  23.   24.   25.]
>   [  33.   34.   35.]
>   [  43.   44.   45.]]
>
>  [[ 145.  146.  147.]
>   [ 155.  156.  157.]
>   [ 165.  166.  167.]]]
>
> Which is the correct output. 
> However :
> p = np.arange(200).reshape((2, 1, 10, 10))
> Q = np.array([[3, 4], [8, 9]])            
> print p                                   
> answer = example5(p, Q)                   
> print answer                              
>
> crashes because the coordinate [8, 9] is near the edge of the 10x10 array 
> whereas [3, 4] isn't. So the two iterations in scan give outputs of two 
> different shapes. So it crashes. 
> How can I solve this problem (either by zero-padding somewhere, or 
> wrapping around the slice) ? I'm not too bothered about exactness, I just 
> need a solution that doesn't crash.
>

-- 

--- 
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