Элегантный способ перевести набор взвешенных сумм в Python - PullRequest
1 голос
/ 30 мая 2019

Учитывая набор терминов ||(p_i' - sum{w_ji*(R_j*p_i+v_j)})||^2, где ||...||^2 обозначает квадратную норму, я хочу эффективно настроить массив (или список) в Python, заполненный этими терминами.p_i', p_i, v_j - трехмерные векторы, а R_j - матрица 3x3.

Я уже пробовал это, но не знаю, как включить сумму вj.

new_points = r_mesh.points() # p', return Nx3 array
old_points = avg_mesh.points() # p
n_joints = 3
rv = np.arange(n_joints * 15) # R_j and v_j are stored in rv
weights = np.random.rand(n_joints, len(new_points)) # w

func = [[np.linalg.norm(
        new_points[i] - (weights[j, i] * ((np.array(rv[j * 15:j * 15 + 9]).reshape(3, 3) @ old_points[i]) + np.array(
            rv[j * 9 + 9: j * 9 + 12])))) for j in range(n_joints)] for i in range(len(new_points))]

Чтобы прояснить ситуацию, приведем исходное уравнение, которое я преобразовал в нелинейную функцию, чтобы подать ее в метод Левенберга-Марквардта.

Imgur

РЕДАКТИРОВАТЬ: Извините, раньше было неправильное изображение.

Ответы [ 2 ]

2 голосов
/ 31 мая 2019

Самый простой («автопилот», не требующий реального мышления) метод будет np.einsum:

# set up example:
n_i, n_j = 20, 30

p = np.random.random((n_i, 3))
pp = np.random.random((n_i, 3))
R = np.random.random((n_j, 3, 3))
w = np.random.random((n_j, n_i))
v = np.random.random((n_j, 3))

# now just tell einsum which index is where and let it 
# do its magic

# R_j p_i
Rp = np.einsum('jkl,il', R,p)
# by Einstein convention this will sum over l,
# so Rp has indices ijk

# w_ji (Rp_ij + v_j)
wRpv = np.einsum('ji,ijk->ik', w,Rp+v)
# pure Einstein convention would sum over i and j,
# we  override this by passing explicit output indices       
# ik to keep i alive

# squared norm
d = pp - wRpv
result = np.einsum('ik,ik', d,d)
0 голосов
/ 30 мая 2019

Хотя я не могу понять, что вы пытаетесь сделать, я вижу, что вы хотите сделать сумму по индексу.Вы нигде не используете sum () в своем коде.Возможно, вы захотите проверить функцию sum ().https://docs.python.org/3/library/functions.html#sum или https://www.programiz.com/python-programming/methods/built-in/sum

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