Numpy Linalg Solve Broadcasting - PullRequest
       10

Numpy Linalg Solve Broadcasting

0 голосов
/ 01 февраля 2019

У меня N матрица N на 2 на 2. Для всех i в {0 ..., N-1} я хочу вычислить:

solve (Ai, b)

Где B - 2 на 2 и Ai = A [i,:,:].Я попытался сделать это в numpy, используя np.linalg.solve, используя то, что я считал правильными операциями вещания в следующем коде (приведенные ниже A и b приведены только для демонстрационных целей, фактическая матрица A намного больше):

import numpy as np
A = np.array([[[1,2],[3,4]],[[2,3],[5,6]],[[3,4],[5,6]]])
b = np.eye(2)
np.linalg.solve(A, b)

Но я получаю следующую ошибку:

ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (3,2,2)->(3,newaxis) (2,2)->(2,newaxis) and requested shape (2)

Я немного запутался ... Я раньше использовал широковещательное вещание и никогда не имел проблем с выполнением операций такого рода в прошлом ...Кто-нибудь знает, что я здесь сделал неправильно?

1 Ответ

0 голосов
/ 01 февраля 2019

Вы пытаетесь решить N различных систем уравнений, фактически вы проходите матрицу N × 2 × 2 A, но только матрицу 2 × 2 b.Это то, к чему относится ошибка, когда говорят, что операнды не могут быть переданы вместе .

Если вы хотите решить Ai x = b для всех i от 0 до N-1, где Ai равно 2 ×2, тогда вам также понадобится b с формой N × 2 × K (N × 2 × 2 в вашем случае).

Нечто подобное будет работать, при условии, что вы всегда хотите b = eye(2):

>>> A = np.array([[[1,2],[3,4]],[[2,3],[5,6]],[[3,4],[5,6]]])
>>> b = np.array([np.eye(2),np.eye(2),np.eye(2)])
>>> np.linalg.solve(A, b)

И это вывод:

array([[[-2.        ,  1.        ],
        [ 1.5       , -0.5       ]],

       [[-2.        ,  1.        ],
        [ 1.66666667, -0.66666667]],

       [[-3.        ,  2.        ],
        [ 2.5       , -1.5       ]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...