Эффективное извлечение поднабора точек зависит от того, какой именно формат вы используете. Предполагая, что вы храните свой растр как массив целых чисел, вы можете извлечь точки следующим образом:
from numpy import *
def points_in_circle(circle, arr):
"A generator to return all points whose indices are within given circle."
i0,j0,r = circle
def intceil(x):
return int(ceil(x))
for i in xrange(intceil(i0-r),intceil(i0+r)):
ri = sqrt(r**2-(i-i0)**2)
for j in xrange(intceil(j0-ri),intceil(j0+ri)):
yield arr[i][j]
points_in_circle
создаст генератор, возвращающий все точки. Обратите внимание, что я использовал yield
вместо return
. Эта функция на самом деле не возвращает значения точек, но описывает, как найти их все. Создает последовательный итератор для значений точек внутри круга. См. Документация Python для более подробной информации о том, как yield
работает.
Я использовал тот факт, что для круга мы можем явно зацикливаться только над внутренними точками. Для более сложных фигур вы можете зациклить точки экстента фигуры, а затем проверить, принадлежит ли ей точка. Хитрость заключается не в том, чтобы проверять каждую точку, только в их узком подмножестве.
Теперь пример использования points_in_circle
:
# raster dimensions, 10 million points
N, M = 3200, 3200
# circle center and its radius in index space
i0, j0, r = 70, 20, 12.3
raster = fromfunction(lambda i,j: 100+10*i+j, (N, M), dtype=int)
print "raster is ready"
print raster
pts_iterator = points_in_circle((i0,j0,r), raster) # very quick, do not extract points yet
pts = array(list(pts_iterator)) # actually extract all points
print pts.size, "points extracted, sum = ", sum(pts)
На растре из 10 миллионов целых чисел это довольно быстро.
Пожалуйста, опишите формат файла или поместите образец где-нибудь, если вам нужен более конкретный ответ.