Numpy element-wise in operation

*爱你&永不变心* 提交于 2019-12-20 04:07:44

问题


Suppose I have a column vector y with length n, and I have a matrix X of size n*m. I want to check for each element i in y, whether the element is in the corresponding row in X. What is the most efficient way of doing this?

For example:

y = [1,2,3,4].T and

X =[[1, 2, 3],[3, 4, 5],[4, 3, 2],[2, 2, 2]]

Then the output should be

[1, 0, 1, 0] or [True, False, True, False] 

which ever is easier.

Of course we can use a for loop to iterate through both y and X, but is there any more efficient way of doing this?


回答1:


Vectorized approach using broadcasting -

((X == y[:,None]).any(1)).astype(int)

Sample run -

In [41]: X        # Input 1
Out[41]: 
array([[1, 2, 3],
       [3, 4, 5],
       [4, 3, 2],
       [2, 2, 2]])

In [42]: y        # Input 2
Out[42]: array([1, 2, 3, 4])

In [43]: X == y[:,None] # Broadcasted  comparison
Out[43]: 
array([[ True, False, False],
       [False, False, False],
       [False,  True, False],
       [False, False, False]], dtype=bool)

In [44]: (X == y[:,None]).any(1) # Check for any match along each row
Out[44]: array([ True, False,  True, False], dtype=bool)

In [45]: ((X == y[:,None]).any(1)).astype(int) # Convert to 1s and 0s
Out[45]: array([1, 0, 1, 0])


来源:https://stackoverflow.com/questions/40175327/numpy-element-wise-in-operation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!