Как преобразовать эту функцию numpy в математическую функцию python? - PullRequest
0 голосов
/ 19 июня 2020

Мне нужно преобразовать эту функцию, написанную с использованием numpy, в математическую функцию python из-за ограничения того, что может быть запущено в этом python env. Чтобы было ясно, я не могу использовать пакет numpy, поэтому мне нужно преобразовать его, чтобы использовать только пакет python math. вычислить-точки-поворота-точки-поворота-точки-траектории-траектории

def angle(dir):
    """
    Returns the angles between vectors.

    Parameters:
    dir is a 2D-array of shape (N,M) representing N vectors in M-dimensional space.

    The return value is a 1D-array of values of shape (N-1,), with each value
    between 0 and pi.

    0 implies the vectors point in the same direction
    pi/2 implies the vectors are orthogonal
    pi implies the vectors point in opposite directions
    """
    dir2 = dir[1:]
    dir1 = dir[:-1]
    return np.arccos((dir1*dir2).sum(axis=1)/(
        np.sqrt((dir1**2).sum(axis=1)*(dir2**2).sum(axis=1))))

1 Ответ

0 голосов
/ 19 июня 2020

Решение с использованием только математического пакета:

Ввод

dir = [[3.6037027761255773, 0.03783693694249879],
 [0.7663216820938965, 1.0418014197729653],
 [-4.471037511834608, 2.7372078232282355],
 [-1.621866618487419, -0.10824572436577373],
 [-0.47906872408710144, -0.8621976119399739],
 [0.5785645169182829, -2.50257598057014],
 [1.4633910499042218, -0.34388406197396804]]

Numpy

dir2 = dir[1:]
dir1 = dir[:-1]

d1 = np.array(dir1)
d2 = np.array(dir2)
np.arccos((d1*d2).sum(axis=1)/(np.sqrt((d1**2).sum(axis=1)*(d2**2).sum(axis=1))))

Вывод: массив ([0.92609311, 1.65565235, 0.61599073, 0.99699313, 0.73435661, 1.11279666])

Использование только математического пакета

from math import sqrt, acos

def sum_elementwise(d):
    return [x+y for x,y in d]

def multiply_elementwise(d1,d2):
    return [[x*y for x, y in zip(a, b)]for a,b in zip(d1 ,d2)]


m1 = sum_elementwise(multiply_elementwise(dir1,dir1))
m2 = sum_elementwise(multiply_elementwise(dir2,dir2))
r1 = [a*b for a,b in zip(m1,m2)]
s1 = [sqrt(a) for a in r1]
e1 = sum_elementwise(multiply_elementwise(dir1,dir2))
x1 = [a/b for a,b in zip(e1,s1)]
result = [acos(a) for a in x1]

Вывод: [0,9260931132998823, 1,6556523484300858, 0,615990729086477, 0,9969931272447804, 0,7343566076471475, 1,112796657373265]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...