2015-10-10 5 views
4

У меня есть список 2d баллов [(x1,y1),(x2,y2),...,(xn,yn)] в numpy, как мне получить список точек в ограничивающей рамке, заданной углами ((bx1,by1),(bx2,by2))?numpy filter points в ограничивающей рамке

Если бы это был C++, я бы использовал OGC "within" specification in boost geometry для фильтрации списка.

Сейчас я просто имею дело со списком индексов в массив NxN 2d numpy, поэтому я ожидаю, что это должно быть всего 1-2 строки кода с numpy.

+0

Meaby вы найдете это полезным: http://stackoverflow.com/questions/1897779/test-if-point-is-in-some-rectangle – grael

+0

Также HTTP: // stackoverflow.com/questions/21612976/point-inside-polygon – grael

ответ

6

Используя комбинацию all, logical_and и оператор <=, один можно выразить основную идею в 1 строке.

import random 
import numpy as np 
from matplotlib import pyplot 

points = [(random.random(), random.random()) for i in range(100)] 

bx1, bx2 = sorted([random.random(), random.random()]) 
by1, by2 = sorted([random.random(), random.random()]) 

pts = np.array(points) 
ll = np.array([bx1, by1]) # lower-left 
ur = np.array([bx2, by2]) # upper-right 

inidx = np.all(np.logical_and(ll <= pts, pts <= ur), axis=1) 
inbox = pts[inidx] 
outbox = pts[np.logical_not(inidx)] 

# this is just for drawing 
rect = np.array([[bx1, by1], [bx1, by2], [bx2, by2], [bx2, by1], [bx1, by1]]) 

pyplot.plot(inbox[:, 0], inbox[:, 1], 'rx', 
      outbox[:, 0], outbox[:, 1], 'bo', 
      rect[:, 0], rect[:, 1], 'g-') 
pyplot.show() 

Illustration of bounding box result

+1

Образец работал отлично, как только я добавил 'pyplot.show()'! Благодаря! –

+0

@AndrewHundt Спасибо за редактирование. Я начал использовать 'pyplot.ion()' (стоит исследовать, если вы этого не сделали), поэтому забыл вызов 'pyplot.show()'. –