import numpy as np

def non_max_suppression_fast(boxes, overlapThresh):

	# if there are no boxes, return an empty list
	
	if len(boxes) == 0:
		return []
		
	# if the boxes are integers, convert them to floats (due to divisions)
	
	if boxes.dtype.kind == "i":
		boxes = boxes.astype("float")
		
	# initialize the list of picked indexes
	
	pick = []
	
	# grab the coordinates of the bounding boxes
	
	x1 = boxes[:,0]
	y1 = boxes[:,1]
	x2 = boxes[:,2]
	y2 = boxes[:,3]
	scores = boxes[:,4]
	
	# compute the area of the boxes and sort the boxes by their score
	
	area = (x2 - x1 + 1) * (y2 - y1 + 1)
	
	idxs = np.argsort(scores)[::-1]
	
	# keep looking while some indexes still remain in the indexes list
	
	while len(idxs) > 0:
	
		# grab the last index in the indexes list and add its value to the list of picked indexes
		
		last = len(idxs) - 1
		
		i = idxs[last]
		
		pick.append(i)
		
		# find the largest coordinates for the start of the overlap area and the smallest coordinates for the end
		
		xx1 = np.maximum(x1[i], x1[idxs[:last]])
		yy1 = np.maximum(y1[i], y1[idxs[:last]])
		xx2 = np.minimum(x2[i], x2[idxs[:last]])
		yy2 = np.minimum(y2[i], y2[idxs[:last]])
		
		# compute the width and height of the overlap
		
		w = np.maximum(0, xx2 - xx1 + 1)
		h = np.maximum(0, yy2 - yy1 + 1)
		
		# compute the ratio of overlap
		
		overlap = (w * h) / area[idxs[:last]]
		
		# delete all indexes from the list that have an overlap over the threshold
		
		idxs = np.delete(idxs, np.concatenate(([last],
			np.where(overlap > overlapThresh)[0])))
		
	# return only the boxes that were picked
		
	return boxes[pick].astype("float")
		
		
		