У меня есть массив точек (баллов), состоящий из значений ~ 30000 x, y и z. У меня также есть отдельный массив точек (называемый вершинами), приблизительно ~ 40000 x, y и z значений. Последний массив индексирует нижние передние левые углы некоторых кубов боковой длины . Я хотел бы узнать, в каких точках находятся кубы, и сколько точек находится в каждом кубе. Я написал цикл, чтобы сделать это, который работает так:Ускорить запрос массива в Numpy/Python
for i in xrange(len(vertices)):
cube=((vertices[i,0]<= points[:,0]) &
(points[:,0]<(vertices[i,0]+size)) &
(vertices[i,1]<= points[:,1]) &
(points[:,1] < (vertices[i,1]+size)) &
(vertices[i,2]<= points[:,2]) &
(points[:,2] < (vertices[i,2]+size))
)
numpoints[i]=len(points[cube])
(Петля заказать отдельные кубики, и «Куб» создает логический массив индексов.) Я тогда магазин точки [куб] где-то , но это не то, что меня замедляет; это создание «куба =».
Я хотел бы ускорить этот цикл (требуется несколько секунд для работы в macbook pro). Я пытался переписывать «куб =» часть в C следующим образом:
for i in xrange(len(vertices)):
cube=zeros(pp, dtype=bool)
code="""
for (int j=0; j<pp; ++j){
if (vertices(i,0)<= points(j,0))
if (points(j,0) < (vertices(i,0)+size))
if (vertices(i,1)<= points(j,1))
if (points(j,1) < (vertices(i,1)+size))
if (vertices(i,2)<= points(j,2))
if (points(j,2) < (vertices(i,2)+size))
cube(j)=1;
}
return_val = 1;"""
weave.inline(code,
['vertices', 'points','size','pp','cube', 'i'])
numpoints[i]=len(points[cube])
Это ускорило его на чуть более чем в два раза. Переписывание как в циклах на C фактически сделало его лишь немного быстрее, чем исходная версия с числовым значением, из-за частых ссылок на объекты массива, необходимые для отслеживания того, в каких точках находятся кубы. Я подозреваю, что это можно сделать гораздо быстрее, и что я чего-то не хватает. Может ли кто-нибудь предложить, как ускорить это? Я новичок в numpy/python, и спасибо заранее.
Спасибо! Я попробую это. – Mike