LINUX.ORG.RU

вызвать функция для numpy массива (антибыдлокод)


0

1

Работаю над ускорением программы. Нужно функцию intersection_line_and_triangle вызвать для numpy массива Fig размерностью Nx9 (здесь 9 координат для трех вершин треугольника, координаты храняться в каждом Fig) . + хотелось бы получить булев массив good_indx (состоящий из True и False, соответственно, чтобы сделать присвоение X_good[good_indx]=X[good_indx]), для этого нужно избавиться еще от одно цикла :)

def intersection_line_and_triangle(x,y,tri):
    a=tri[:3];  b=tri[3:6];  c=tri[6:];
    n=normal(tri)
    d=dot(a-x,n)/dot(y-x,n)
    if d<0 or d>1:
        return False
    zz=x+d*(y-x);
    za=a-zz; zb=b-zz;  zc=c-zz
    mza=linalg.norm(za);
    mzb=linalg.norm(zb);
    mzc=linalg.norm(zc)
    if arccos(dot(za,zb)/mza/mzb) + arccos(dot(zb,zc)/mzb/mzc) + arccos(dot(zc,za)/mzc/mza) < 2.*pi:
        return False
    else:
        return True

быдлокод (работающий, но очень медленно) здесь:

def intersection_line_and_border(x,y,b):
    res=False
    for i in range(b.shape[0]):
        if intersection_line_and_triangle(x,y,b[i]):
            res=True
    return res


  for i in range(X):
        for j in range(3):
            if not intersection_line_and_border(center_point,X[i][3*j:3*(j+1)],Fig):
                X_good[i][3*j:3*(j+1)]=X[i][3*j:3*(j+1)]

Ответ на: комментарий от eth

а по скорости вызов python функции для массива через apply_along_axis() сильно уступает вызову сишной функции для numpy-массива через ctypes?

scireseacher
() автор топика
Ответ на: комментарий от anonymous

anonymous вы ошибаетесь.

Если задача представляется в матричном виде на Python/numpy, то все остальное отдыхает по простоте кода и эффективности. Но трудно все что угодно перевести в матричный вид.

scireseacher
() автор топика
Ответ на: комментарий от scireseacher

>простоте кода и эффективности
хм.. А это numpy может распараллеливать операции, и задействует ли оно sse?
Против питона и нумпи ничего не имею, просто интересно.

Bad_ptr ★★★★★
()

>for i in range(X)
Когда ковырял питон(версия 2.с чем-то), везде советовали вместо range использовать xrange, это типа дает какой-то прирост в производительности, т.к. range создает на каждое значение новый объект, а xrange нет. Чё-то типа того.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

про расспараллеливание и sse сказать ничего не могу :( , только начал разбираться.

P.S.1

но, я проделал простой тесты: заполнение матрицы и решение СЛАУ на одном ядре, на numpy, Си и, дополнительно, для решения СЛАУ использовал solve из boost. Так вот numpy гораздо быстрее работает, если удасться решение свести к матричным действиям + приятно вызвать, например, linalg.solve и самому не париться с методами решения СЛАУ ...

P.S.2

то что в матричном виде не представляется можно писать на Си. Если хорошо знакомы с sse могли бы показать примерчик скалярного умножения двух векторов в 2D или 3D :)

scireseacher
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.