BOSSrobot
BOSSrobot

Reputation: 27

Doing a specific comparison along the columns of two matricies

I have two numpy matricies of the same shape. In one of them each column contains all 0's except for a 1. In the other matrix each column contains random numbers.

My goal is to count the number of columns for which the position of the 1 in the column of the first matrix corresponds with the position of the highest element in the column of the second matrix.

For example:

 a = [[1,0],
      [0,1]]
 b = [[2,3],
      [3,5]]
 myFunc(a,b)

would yield 1 since the argmax of the first column in b is not the same as in a but it is the same in the second column.

My solution was to iterate over the columns and check if the argmax was the same, store that in a list and then sum that at the end, but this doesn't take advantage of numpy's fastness. Is there a faster way to do this? Thanks!

Upvotes: 0

Views: 50

Answers (2)

G. Anderson
G. Anderson

Reputation: 5955

Given that there will only be a single 1 in the first array, then you should just be able to compare where the argmax is at the same position

def myfunc(binary_array,value_array):
    return np.sum(a.argmax(axis=1)==b.argmax(axis=1))

a = np.array([[1,0],
     [0,1]])
b = np.array([[2,3],
     [3,5]])

myfunc(a,b)
1

c=np.array([[0,1,0],[1,0,0],[0,0,1]])
d=np.array([[1,2,3],[2,2,3],[1,3,4]]) 

myfunc(c,d)
1

e=np.array([[0,1,0],[0,0,1],[0,0,1]])
f=np.array([[1,2,3],[2,2,3],[1,3,4]]) 

myfunc(e,f)
2

Upvotes: 1

Ehsan
Ehsan

Reputation: 12407

This checks the indices of max in each column of b against indices of 1s in corresponding column of a and counts the matches:

(a.T.nonzero()[1]==b.argmax(axis=0)).sum()

output in your example:

1

Upvotes: 1

Related Questions