Общее использование многоточия в np.einsum ⇐ Python
-
Гость
Общее использование многоточия в np.einsum
Я пытаюсь реализовать вычисления в тензорной сети, используя np.einsum. Цель расчета состоит в том, чтобы локальная матрица 2x2 последовательно действовала на тензор размера (2,2,2,...,2,2,2), где количество измерений может быть произвольным (если позволяет память). ). У меня есть работающая наивная реализация для тензора размера (2,2,2)
X = np.array([[1,2],[3,4]]) Y = np.ones(2**3).reshape((2,2,2)) Aijk = np.einsum('zi,zjk', X, Y) Bijk = np.einsum('zi,jzk', X, Aijk) Cijk = np.einsum('zi,jkz', X, Bijk) Как видно, суммируемый индекс должен смещаться вправо при каждом последующем расчете. Я мог бы сгенерировать соответствующую явную строку, но мне интересно, возможно ли реализовать это с помощью эллипсов, но я не уверен, как указать позицию индекса, если индекс не является крайним левым или правым индексом.
X = np.array([[1,2],[3,4]]) Y = np.ones(2**n).reshape(shape) # где shape — соответствующий n-кортеж A = np.einsum('a...,a...', X, Y) B = np.einsum('b...,...b...', X, A) # как указать, что суммированный индекс A является вторым? ... N = np.einsum('l...,...l', X, M) Надеюсь, вам понятно, чего я пытаюсь достичь.
Я пытаюсь реализовать вычисления в тензорной сети, используя np.einsum. Цель расчета состоит в том, чтобы локальная матрица 2x2 последовательно действовала на тензор размера (2,2,2,...,2,2,2), где количество измерений может быть произвольным (если позволяет память). ). У меня есть работающая наивная реализация для тензора размера (2,2,2)
X = np.array([[1,2],[3,4]]) Y = np.ones(2**3).reshape((2,2,2)) Aijk = np.einsum('zi,zjk', X, Y) Bijk = np.einsum('zi,jzk', X, Aijk) Cijk = np.einsum('zi,jkz', X, Bijk) Как видно, суммируемый индекс должен смещаться вправо при каждом последующем расчете. Я мог бы сгенерировать соответствующую явную строку, но мне интересно, возможно ли реализовать это с помощью эллипсов, но я не уверен, как указать позицию индекса, если индекс не является крайним левым или правым индексом.
X = np.array([[1,2],[3,4]]) Y = np.ones(2**n).reshape(shape) # где shape — соответствующий n-кортеж A = np.einsum('a...,a...', X, Y) B = np.einsum('b...,...b...', X, A) # как указать, что суммированный индекс A является вторым? ... N = np.einsum('l...,...l', X, M) Надеюсь, вам понятно, чего я пытаюсь достичь.
Мобильная версия