для транспонирования:
тестирование немного в IPython показал:
In [1]: import numpy
In [2]: x = numpy.ones((5,6,3,4))
In [3]: numpy.transpose(x,(0,1,3,2)).shape
Out[3]: (5, 6, 4, 3)
так что вы можете просто сделать
Atrans = numpy.transpose(A,(0,1,3,2))
транспонировать второго и третьего измерения (оставляя размеры 0 и 1 одинаковыми)
для инверсии:
последний пример http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv
обратных нескольких матриц могут быть вычислены сразу:
from numpy.linalg import inv
a = np.array([[[1., 2.], [3., 4.]], [[1, 3], [3, 5]]])
>>> inv(a)
array([[[-2. , 1. ],
[ 1.5, -0.5]],
[[-5. , 2. ],
[ 3. , -1. ]]])
Так я думаю, в вашем случае, инверсия может будет осуществляться только с
Ainv = inv(A)
, и он будет знать, что последние два измерения - это те, которые он должен перевернуть, и что первые измерения - это то, как вы складывали свои данные. Это должно быть намного быстрее
разница в скорости
для транспонирования: ваш метод требует 3.77557015419 сек, и мои потребности 2.86102294922e-06 сек (что является убыстрение более 1 миллиона раз)
для инверсии: я думаю, моя версия numpy недостаточно высока, чтобы попробовать трюк numpy.linalg.inv с формой (n, n, 3,3), чтобы увидеть ускорение там (моя версия 1.6.2, а документы я основывал свое решение на 1,8, но он должен работать на 1,8, если кто-то может это проверить?)
Ваш A не является матрицей, а тензором. Для тензора неясно, как определить обратную или транспонированную. Если вы хотите инвертировать/перенести 2-мерный массив матриц, вы можете посмотреть на тензинину numpy. – Martin