Vertical roller in 2d array

How to (effectively) do the following:

x = np.arange(49) x2 = np.reshape(x, (7,7)) x2 array([[ 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]]) 

From here I want to drop a couple of things. I want to drop 0,7,14,21 etc., so 14 will return. Then the same thing with 4,11,18,25, etc., 39 - up.
The result should be:

 x2 array([[14, 1, 2, 3, 39, 5, 6], [21, 8, 9, 10, 46, 12, 13], [28, 15, 16, 17, 4, 19, 20], [35, 22, 23, 24, 11, 26, 27], [42, 29, 30, 31, 18, 33, 34], [ 0, 36, 37, 38, 25, 40, 41], [ 7, 43, 44, 45, 32, 47, 48]]) 

I looked at numpy.roll, here and google, but could not find how to do this.
For horizontal rolls, I could:

 np.roll(x2[0], 3, axis=0) x3 array([4, 5, 6, 0, 1, 2, 3]) 

But how do I return a full array with this roll change as a new copy?

+6
source share
3 answers

Roll with a negative shift:

 x2[:, 0] = np.roll(x2[:, 0], -2) 

Positive shift roll:

 x2[:, 4] = np.roll(x2[:, 4], 2) 

gives:

 >>>x2 array([[14, 1, 2, 3, 39, 5, 6], [21, 8, 9, 10, 46, 12, 13], [28, 15, 16, 17, 4, 19, 20], [35, 22, 23, 24, 11, 26, 27], [42, 29, 30, 31, 18, 33, 34], [ 0, 36, 37, 38, 25, 40, 41], [ 7, 43, 44, 45, 32, 47, 48]]) 
+3
source

You need to overwrite the column

eg:.

 x2[:,0] = np.roll(x2[:,0], 3) 
0
source

Here you can flip multiple columns at a time using advanced-indexing -

 # Params cols = [0,4] # Columns to be rolled dirn = [2,-2] # Offset with direction as sign n = x2.shape[0] x2[:,cols] = x2[np.mod(np.arange(n)[:,None] + dirn,n),cols] 

Run Example -

 In [45]: x2 Out[45]: array([[ 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]]) In [46]: cols = [0,4,5] # Columns to be rolled ...: dirn = [2,-2,4] # Offset with direction as sign ...: n = x2.shape[0] ...: x2[:,cols] = x2[np.mod(np.arange(n)[:,None] + dirn,n),cols] ...: In [47]: x2 # Three columns rolled Out[47]: array([[14, 1, 2, 3, 39, 33, 6], [21, 8, 9, 10, 46, 40, 13], [28, 15, 16, 17, 4, 47, 20], [35, 22, 23, 24, 11, 5, 27], [42, 29, 30, 31, 18, 12, 34], [ 0, 36, 37, 38, 25, 19, 41], [ 7, 43, 44, 45, 32, 26, 48]]) 
0
source

Source: https://habr.com/ru/post/1011909/


All Articles