Reputation: 3
I have a numpy array of IoU values with 300 rows and 4 columns. A row is selected if every element in that row is less than 0.5. I wrote a code which try to do this but it returns rows in which every element is zero.
import numpy as np
iou = np.random.rand(300,4)
negative_boxes = []
for x in range(len(iou)):
if iou[x,:].any() < 0.5:
negative_boxes.append(iou[x])
How to select rows in which every element is less than 0.5?
Upvotes: 0
Views: 3284
Reputation: 1257
Instead of a for
loop, you can use numpy masks, that are more efficient.
With your problem:
import numpy as np
iou = np.random.rand(300,4)
indices = np.where((iou < 0.5).all(axis=1))
negative_boxes = iou[indices]
Then indices
contains all the indices of the rows where all values are smaller than 0.5 and negative_boxes
contains the array with only the small values you are looking for.
Upvotes: 2
Reputation: 1352
a.any()
returns True
if any of the elements of a
evaluate to True
, False
otherwise.
if iou[x,:].any() < 0.5
implicitly converts the boolean value returned by iou[x,:].any()
to 0 and 1 (in fact, bool
is a subclass of int
). Thus iou[x,:].any() < 0.5
is True
if and only if iou[x,:].any()
is False, i.e., every element of iou[x,:]
is 0.
To check if all elements of an array a
are less than 0.5, use np.all
:
import numpy as np
iou = np.random.rand(300,4)
negative_boxes = []
for x in range(len(iou)):
if np.all(iou[x, :] < 0.5):
negative_boxes.append(iou[x])
Upvotes: 1