Numpy Slicing - вычисляет матричные псевдообращения без итерации из массива 3x3 - PullRequest
1 голос
/ 30 марта 2020

У меня есть N , 2x4 массивы, хранящиеся в ( 2x4xN ) массиве J. Я пытаюсь вычислить псевдообратное значение для каждого из массивов N , 2x4 и сохранить псевдообращения в массив (N x 4 x 2) J_pinv.

То, что я сейчас делаю:

J_pinvs = np.zeros((N, 4, 2))
for i in range(N):
    J_pinvs[i, :, :] = np.transpose(J[:, :, i]) @ np.linalg.inv(J[:, :, i] @ J[:, :, i].transpose())

Это работает, но я хотел бы ускорить время вычислений, так как оно будет выполняться в слое нейронной сети, поэтому я хотел бы сделать это как как можно быстрее.

Что я пробовал:

J_pinvs = np.zeros((N, 4, 2))
J_pinvs2[:, :, :] = np.transpose(J[:, :, :]) @ np.linalg.inv(J[:, :, :] @ J[:, :, :].transpose())

Генерирует ошибку :

<ipython-input-87-d8ee1ba2ae5e> in <module>
      1 J_pinvs2 = np.zeros((4, 2, 3))
----> 2 J_pinvs2[:, :, :] = np.transpose(J[:, :, :]) @ np.linalg.inv(J[:, :, :] @ J[:, :, :].transpose())

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 4 is different from 3)

Есть ли способ сделать это с нарезкой, чтобы мне не нужно использовать итератор? У меня проблемы с поиском чего-нибудь онлайн. Любая помощь / предложения будут оценены!

Спасибо, JM

1 Ответ

1 голос
/ 30 марта 2020

Я думаю, вам нужно указать, как транспонировать трехмерный массив:

np.linalg.inv(a @ a.transpose(0,2,1))

будет работать. В отличие от

# sample data
a = np.arange(24).reshape(-1,2,4)

a.shape 
# (3, 2, 4)

a.transpose().shape
# (4, 2, 3)

и

a @ a.transpose()

не будут работать.

Наконец, весь сценарий должен быть:

a.transpose(0,2,1) @ np.linalg.inv(a @ a.transpose(0,2,1))
...