python - numpy - много матриц, умножающих много векторов - PullRequest
0 голосов
/ 12 июня 2018

У меня есть множество матриц, каждая из которых соответствует вектору.Я хочу умело умножить каждую матрицу на ее вектор.Я знаю, что могу поместить все матрицы в диагональную форму большого блока и умножить их на большой объединенный вектор.

Я хочу знать, есть ли способ использовать numpy.dot для умножения всех их вэффективный способ.

Я пытался использовать numpy.stack и numpy.dot, но я не могу получить только нужные векторы.

Чтобы быть более конкретным.Мои матрицы выглядят так:

R_stack = np.stack((R, R2, R3))

, что составляет

array([[[-0.60653066,  1.64872127],
    [ 0.60653066, -1.64872127]],

   [[-0.36787944,  2.71828183],
    [ 0.36787944, -2.71828183]],

   [[-0.22313016,  4.48168907],
    [ 0.22313016, -4.48168907]]])

, а мои векторы выглядят так:

p_stack = np.stack((p0, p0_2, p0_3))

, что составляет

array([[[0.73105858],
    [0.26894142]],

   [[0.88079708],
    [0.11920292]],

   [[0.95257413],
    [0.04742587]]])

Я хочу умножить следующее: R*p0, R2*p0_2, R3*p0_3.

Когда я делаю dot:

np.dot(R_stack, p_stack)[:,:,:,0]

, я получаю

array([[[ 0.        , -0.33769804, -0.49957337],
    [ 0.        ,  0.33769804,  0.49957337]],

   [[ 0.46211716,  0.        , -0.22151555],
    [-0.46211716,  0.        ,  0.22151555]],

   [[ 1.04219061,  0.33769804,  0.        ],
    [-1.04219061, -0.33769804,  0.        ]]])

3 вектора Iменя интересуют 3 [0,0] вектора по диагонали.Как я могу получить их?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Другой способ, который я нашел, это использовать numpy.diagonal

np.diagonal(np.dot(R_stack, p_stack)[:,:,:,0], axis1=0, axis2=2)

, который дает вектор в каждом столбце:

array([[0., 0., 0.],
   [0., 0., 0.]])
0 голосов
/ 12 июня 2018

Вы почти у цели.Вам необходимо добавить диагональный индекс для 1-го и 3-го измерений следующим образом:

np.dot(R_stack, p_stack)[np.arange(3),:,np.arange(3),0]

Каждая строка в результате будет соответствовать одному из ваших желаемых векторов:

array([[-3.48805945e-09,  3.48805945e-09],
       [-5.02509157e-09,  5.02509157e-09],
       [-1.48245199e-08,  1.48245199e-08]])
...