С использованием функции numpy библиотеки python можно использовать функцию cumprod для оценки совокупных продуктов, например.Как складывать/накапливать матричный продукт (точка)?
a = np.array([1,2,3,4,2])
np.cumprod(a)
дает
array([ 1, 2, 6, 24, 48])
Это действительно возможно применить эту функцию только по одной оси.
Я хотел был бы сделать то же самое с матрицами (представленными как массивы numpy), например. если у меня есть
S0 = np.array([[1, 0], [0, 1]])
Sx = np.array([[0, 1], [1, 0]])
Sy = np.array([[0, -1j], [1j, 0]])
Sz = np.array([[1, 0], [0, -1]])
и
b = np.array([S0, Sx, Sy, Sz])
, то я хотел бы иметь функцию в cumprod
-как, которая дает
np.array([S0, S0.dot(Sx), S0.dot(Sx).dot(Sy), S0.dot(Sx).dot(Sy).dot(Sz)])
(Это простой пример, на самом деле у меня есть потенциально больших матриц, оцененных над n-мерными сетками, поэтому я ищу наиболее простые и эффективный способ оценить эту вещь.)
В частности, Mathematica Я хотел бы использовать
FoldList[Dot, IdentityMatrix[2], {S0, Sx, Sy, Sz}]
так что я искал кратное функции, и все, что я нашел это accumulate
метод на numpy.ufunc
с. Честно говоря, я знаю, что я, вероятно, обречены, потому что попытка
np.core.umath_tests.matrix_multiply.accumulate(np.array([pauli_0, pauli_x, pauli_y, pauli_z]))
, как указано в a numpy mailing list дает ошибку
Reduction not defined on ufunc with signature
Есть ли у вас представление о том, как (эффективно) делают этот вид расчет?
Заранее спасибо.
делать ли это, что вы хотите? 'itertools.accumulate (b, func = lambda x, y: x.dot (y))'? Вам нужно будет импортировать модуль 'itertools'. – Rufflewind
Да, это сработало бы, если бы мне не пришлось выполнять накопление вдоль некоторой оси многомерного массива. –
Если ваши матрицы большие, но * число * матриц мало, я могу просто написать функцию с петлей и продолжить свой день; мне требуется ~ 200 us, чтобы взять точечный продукт двух матриц с плавающей запятой 100x100 и только 1 us для выполнения 'for i в диапазоне (100): pass', так что вполне возможно, что служебные данные функции будут незначительными. – DSM