Keep First Non-Zero Element, Set All Others to 0

matlab find first non zero element in each row
matlab find first value greater than
matlab find position of value in array
find non zero elements
matlab find first non zero digit
matlab logical indexing
non zero column matrix
matlab max

I have a 2-d NumPy array that looks like this:

array([[0. , 0. , 0.2, 0.2],
       [0.3, 0. , 0.3, 0. ]])

I'd like to modify it so that each row consists of all 0's, except for the first non-zero entry. If it's all 0s to start with, we don't change anything.

I could do this:

example = np.array([[0,0, 0.2, 0.2], [0.3, 0, 0.3, 0]])
my_copy = np.zeros_like(example)
for i, row in enumerate(example):
    for j, elem in enumerate(row):
        if elem > 0:
            my_copy[i, j] = elem
            break

But that's ugly and not vectorized. Any suggestions for how to vectorize this?

Thanks!

Simply

e =np.zeros(example.shape)
rows = np.arange(example.shape[0])
cols =  np.argmax(example != 0, 1)
e[rows, cols] = example[rows, cols]

How to find first nonzero element/first '1' per row and set other , Learn more about indexing, matrix, first element, nonzero, set to zero, find, maximum. I've a Matrix f.ex. like. A=[0,1,1,0; 1,0,0,1;0,0,0,1;0,1,1,1]; A = 0 1 1 0. 1 0 0 1. 0 0 0 1. 0 1 1 1. only in 3D. I want to as a result only the first '1' of each row and all other elements or further "1" to zero. The result Get Support. Installation  How to lookup first non-zero value and return corresponding column header in Excel? Supposing, you have a range of data, now, you want to return the column header in that row where the first non-zero value occurs as following screenshot shown, this article, I will introduce a useful formula for you to deal with this task in Excel.

Here's a vectorised solution. The trick is to calculate your first non-zero entries via bool conversion and argmax.

import numpy as np

A = np.array([[0. , 0. , 0.2, 0.2],
              [0.3, 0. , 0.3, 0. ],
              [0. , 0. , 0. , 0. ]])

res = np.zeros(A.shape)
idx =  np.arange(res.shape[0])
args = A.astype(bool).argmax(1)
res[idx, args] = A[idx, args]

print(res)

array([[ 0. ,  0. ,  0.2,  0. ],
       [ 0.3,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ]])

How to get the index of the first non-zero element in an 1-D array in , I want to find the index of the first non-zero element in a 1-D array in simulink, just like the way that 'find' command in matlab did. idx = find(x~=0, 1, 'first'); to zero. for example, if the eigenvalue small than 2, i set it to zero and keep those eigen Other MathWorks country sites are not optimized for visits from your location. extracting non-zero elements in a matrix or an Learn more about matrix, urgent, indexing MATLAB

Setup

x = np.array([[0. , 0. , 0.2, 0.2],
          [0.3, 0. , 0.3, 0. ],
          [0. , 0. , 0. , 0. ]])

Using logical_and with np.eye:

m = (x!=0).argmax(1)
x[~np.logical_and(x, np.eye(x.shape[1])[m])] = 0

Output:

array([[0. , 0. , 0.2, 0. ],
       [0.3, 0. , 0. , 0. ],
       [0. , 0. , 0. , 0. ]])

Using this method will be slightly slower than the other two suggested.

Find indices and values of nonzero elements, https://docs.scipy.org › doc › numpy › reference › generated › numpy.non I want to as a result only the first '1' of each row and all other elements or further "1" to zero. The result should be:

numpy.nonzero, numpy. nonzero (a)[source]¶. Return the indices of the elements that are non-​zero. ..deprecated:: 1.17.0: Use atleast1d explicitly if this behavior is deliberate. I am doing the svd in Simulink, I got the eigenvalue, now I want to set some eigenvalues smaller than a given value to zero. for example, if the eigenvalue small than 2, i set it to zero and keep the those eigen values large than 2 unchanged, incuding the place in the matix and the value. PS: my matlab is 2009b, there are no Find block. so I

Excel Formula To Get First Non-Zero Value in Row and Return , I accepted the answer above but wanted to show the other way I found to do it, in case it helps anyone. =OFFSET($I$8,0,MATCH(0,J10:N10,1)+1). You could also​  Re: How to globally change all z values to 0 The previous solution does not work for odd objects such as multilines. Here is a short lisp script which seems to work for most objects and allows the user to choose globally changing the Z coordinate or selecting a set to change.

Nonzero Row, A (0, 1)-valued matrix has the circular 1's property for columns if its rows can be First, that the nonzero rows, considered as vectors, form a linearly independent set, and The first nonzero element in the first nonzero row of a row-reduced matrix must be unity. Then, no other rows have a nonzero element in that column. I have an Na-by-Nt matrix which is sparse, i.e.: most elements are zeros. I want to find the indices of the non-zeros elements in the form of (i,j) where i is the row and j is the column.

Comments
  • Please add a wanted result example. Thanks.
  • Can you update yours so that it dynamically calculates rows, I don't want to mess up the answer :P I think it would just be np.arange(len(example))
  • Updated, very fast.
  • Its faster with idx = np.arange(res.shape[0]) for the first approach.
  • @Divakar yea the first and 3rd approaches are pretty much identical, but range is hella slow. Are you planning on putting us all to shame with an answer? :)