numpy - Order of repetition per row and column in Python -


i have been trying figure order of repetition per-row , couldn't it. ok. lets consider ndarray of size (2, 11, 10)

a = np.array([     [         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],         [1, 1, 0, 0, 0, 1, 1, 1, 0, 0],         [0, 1, 0, 0, 0, 1, 0, 0, 1, 0],         [1, 1, 0, 0, 1, 1, 1, 1, 0, 0],         [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],         [1, 0, 0, 1, 0, 1, 1, 1, 0, 0],         [1, 1, 0, 1, 1, 0, 1, 1, 0, 0],         [0, 1, 1, 1, 0, 0, 1, 1, 0, 1],         [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],         [0, 0, 1, 1, 0, 1, 0, 0, 1, 1],         [0, 1, 1, 1, 0, 0, 1, 1, 0, 1]     ],     [         [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],         [0, 1, 0, 0, 1, 0, 0, 0, 1, 1],         [0, 1, 0, 1, 0, 0, 0, 1, 0, 0],         [1, 1, 0, 1, 0, 1, 1, 1, 0, 0],         [1, 1, 0, 1, 0, 0, 0, 0, 0, 0],         [1, 1, 1, 0, 0, 0, 1, 1, 0, 0],         [1, 0, 0, 0, 1, 1, 0, 0, 1, 1],         [1, 1, 1, 0, 0, 1, 1, 1, 0, 1],         [1, 0, 0, 1, 1, 0, 1, 0, 1, 0],         [1, 0, 0, 0, 0, 0, 1, 0, 0, 0],         [1, 1, 1, 0, 0, 1, 1, 1, 0, 1]     ] ]) 

what wanted order of every 1's per row based on column. whenever first 1 found in row order starts start @ 0; goes second row if 1 found here order 1, if 1 present @ column index in previous row, ignored. example

lets consider these lists:

   0  1  2  3  4  5  6  7  8  9   -> column index 0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], -> no 1's no order here 1 [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], -> order starts @ 0 2 [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], -> order starts @ 1 

at row index 0 there no 1 nothing happens, @ row index 1 there ones in column index [0,1,5,6,7] equal 0; output should be

column   order 0         0 1         0 2         - 3         - 4         -    5         0 6         0 7         0 8         - 9         - 

at row index 2 there 1 @ column index [1,5,8] whos order 1; in there 1 , 5 ignored because has order 0 it, unknown order should 1; final output should

column   order 0         0 1         0 2         - 3         - 4         -    5         0 6         0 7         0 8         1 9         - 

i have tried using numpy's np.where method index values; this

index = np.asarray(np.where(a == 1)).t 

i have no idea next. can please me?

apparently, desired result--based on comments on question , earlier version of answer--is find "dense ranking" of row index of first 1 in each column. (see docstring of scipy.stats.rankdata meaning of "dense ranking".) result can found using combination of .argmax() method , scipy.stats.rankdata.

here's function computes order two-dimensional array. question doesn't define should happen when column zeros; order assigns column value -1.

from scipy.stats import rankdata  def order(x):     result = x.argmax(axis=0)     result[(x == 0).all(axis=0)] = -1     rank = rankdata(result, method='dense') - 1 - np.any(result < 0)     return rank 

for example, here array y:

in [71]: y out[71]:  array([[0, 1, 0, 0, 1, 1, 0, 0],        [0, 0, 0, 0, 0, 1, 0, 0],        [1, 1, 1, 0, 1, 1, 0, 0],        [1, 0, 1, 1, 1, 1, 0, 0],        [1, 0, 0, 0, 1, 1, 1, 0]])  in [72]: order(y) out[72]: array([ 1,  0,  1,  2,  0,  0,  3, -1]) 

here's array a question:

in [73]: out[73]:  array([[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],         [1, 1, 0, 0, 0, 1, 1, 1, 0, 0],         [0, 1, 0, 0, 0, 1, 0, 0, 1, 0],         [1, 1, 0, 0, 1, 1, 1, 1, 0, 0],         [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],         [1, 0, 0, 1, 0, 1, 1, 1, 0, 0],         [1, 1, 0, 1, 1, 0, 1, 1, 0, 0],         [0, 1, 1, 1, 0, 0, 1, 1, 0, 1],         [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],         [0, 0, 1, 1, 0, 1, 0, 0, 1, 1],         [0, 1, 1, 1, 0, 0, 1, 1, 0, 1]],         [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],         [0, 1, 0, 0, 1, 0, 0, 0, 1, 1],         [0, 1, 0, 1, 0, 0, 0, 1, 0, 0],         [1, 1, 0, 1, 0, 1, 1, 1, 0, 0],         [1, 1, 0, 1, 0, 0, 0, 0, 0, 0],         [1, 1, 1, 0, 0, 0, 1, 1, 0, 0],         [1, 0, 0, 0, 1, 1, 0, 0, 1, 1],         [1, 1, 1, 0, 0, 1, 1, 1, 0, 1],         [1, 0, 0, 1, 1, 0, 1, 0, 1, 0],         [1, 0, 0, 0, 0, 0, 1, 0, 0, 0],         [1, 1, 1, 0, 0, 1, 1, 1, 0, 1]]]) 

the function order() expects two-dimensional array, must use loop order each subarray in a:

in [74]: np.array([order(m) m in a]) out[74]:  array([[0, 0, 3, 3, 2, 0, 0, 0, 1, 4],        [2, 0, 3, 1, 0, 2, 2, 1, 0, 0]]) 

Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -