MrT77
MrT77

Reputation: 953

How to determine the indices of rows for which the sum of certain columns are 0?

How can I determine the indices of rows for which the sum of certain columns are 0?

For example, in the following array:

array([[ 0.9200001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 1.8800001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 2.2100001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 3.3400001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 4.3100001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 5.5900001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 6.7500001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 7.8300001,  0.       ,  0.       ,  0.       ,  0.       ],
       [ 8.8500001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 9.1600001,  0.       ,  0.       ,  0.       ,  0.       ],
       [10.3900001,  0.       ,  0.       ,  1.       ,  1.       ],
       [13.5600001,  0.       ,  0.       ,  1.       ,  1.       ]])

I'd like to get the indices of rows for which the sum of columns (1: ) is zero. In this case, it would be [7,9].

I already tried different combinations without success:

Sorry in advance, as I imagine this is a simple question, but I can't figure it out.

Upvotes: 1

Views: 449

Answers (3)

mo1ein
mo1ein

Reputation: 605

I used simple way:

import numpy as np
array=np.array([[ 0.9200001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 1.8800001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 2.2100001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 3.3400001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 4.3100001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 5.5900001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 6.7500001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 7.8300001,  0.       ,  0.       ,  0.       ,  0.       ],
       [ 8.8500001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 9.1600001,  0.       ,  0.       ,  0.       ,  0.       ],
       [10.3900001,  0.       ,  0.       ,  1.       ,  1.       ],
       [13.5600001,  0.       ,  0.       ,  1.       ,  1.       ]])

sumrow = np.sum(array, axis=1)
for i in range(len(array)):
    if array[i][0]==sumrow[i]:
        print(i)

Upvotes: 1

Andreas
Andreas

Reputation: 9197

import numpy as np
a = np.array([[ 0.9200001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 1.8800001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 2.2100001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 3.3400001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 4.3100001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 5.5900001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 6.7500001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 7.8300001,  0.       ,  0.       ,  0.       ,  0.       ],
       [ 8.8500001,  1.       ,  0.       ,  0.       ,  0.       ],
       [ 9.1600001,  0.       ,  0.       ,  0.       ,  0.       ],
       [10.3900001,  0.       ,  0.       ,  1.       ,  1.       ],
       [13.5600001,  0.       ,  0.       ,  1.       ,  1.       ]])

# slice the array and only use the columns which shall be summed:
b = a[:,1:]
# then sum the columns by axis 1
c = b.sum(axis=1)
# then get the indices
np.where(c==0)
#out: (array([7, 9], dtype=int64),)

or in one line:

print(np.where(a[:,1:].sum(axis=1)==0))

Upvotes: 1

Graeme
Graeme

Reputation: 169

Since you want to sum over the columns, you need axis=1. If a is your array:

np.nonzero(a[:,1:].sum(axis=1)==0)

Upvotes: 2

Related Questions