Векторизация numpy.linalg.lstsq

У меня есть два набора точек (A1, A2, B1, B2), для которых я хочу вычислить аффинное преобразование (от A1 до B1, от A2 до B2). Используя numpy.linalg.lstsq, это очень просто для одного случая:

A1 = [[100   0   0]
      [  0 100   0]
      [100 100   0]
      [  0   0 100]
      [100 100 100]]

B1 = [[160   0   0]
      [  0 160   0]
      [160 160   0]
      [  0   0 160]
      [160 160 160]]

A1 = np.hstack([A1, np.ones((A1.shape[0], 1))])
B1 = np.hstack([B1, np.ones((B2.shape[0], 1))])
affine_transformation = np.linalg.lstsq(A1, B1, rcond=None)[0].transpose()

Я хочу векторизовать это, чтобы вычислить его для нескольких наборов точек без цикла. Я хотел бы получить что-то вроде этого:

pts_a = np.array([A1, A2])
pts_a = np.pad(pts_a, ((0, 0), (0, 0), (0,1)), mode='constant', constant_values=1)
pts_b = np.array([B1, B2])
pts_b = np.pad(pts_b, ((0, 0), (0, 0), (0,1)), mode='constant', constant_values=1)
affine_transformation = np.linalg.lstsq(pts_a, pts_b, rcond=None)[0].transpose()

Любая помощь высоко ценится!


person Felipe Moser    schedule 24.07.2018    source источник


Ответы (1)


Я отсортировал это, используя это:

 affine_transformation = np.asarray([np.linalg.lstsq(pts_a[i,:,:], pts_b[i,:,:], rcond=None)[0].transpose() for i in range(pts_a.shape[0])])

Есть ли более эффективный способ?

person Felipe Moser    schedule 24.07.2018