Использование NumPy Einsum для вещания с вычитанием большого размера - PullRequest
0 голосов
/ 01 апреля 2019

У меня проблемы с использованием вычитания радиовещания.Моя проблема заключается в следующем.У меня есть массив x формы [L,N], где L - целое число, а N - количество переменных в моей задаче.Мне нужно вычислить массив [L,N,N], где в каждом элементе l,i,j он содержит x[l,i]-x[l,j].Если L = 1, это эквивалентно запуску вещания на вычитании: x-x.T

Например, здесь с L = 1 и N = 3:

import numpy as np
x = np.array([[0,2,4]])
x-x.T

Однако, если увеличить размерL вещи становятся более сложными и входят в сферу функции np.einsum.Поэтому я попытался воссоздать мой пример, в случае L = 2, где я реплицировал две строки.То, что я ожидал бы получить массив 2x3x3 с двумя матрицами 3x3 с равными элементами.

x = np.array([[0,2,4],[0,2,4]])
n = 3
k = 2
X = np.zeros([k,n,n])
for l in range(k):
    for i in range(n):
        for j in range(n):
            X[l,i,j] = x[l,i]-x[l,j]
print(X)

, который возвращает

[[[ 0. -2. -4.]
[ 2.  0. -2.]
[ 4.  2.  0.]]

[[ 0.  -2. -4.]
[2.  0. -2.]
[ 4.  2.  0.]]]

Но как сделать это с NumPy Einsum?Я могу получить только продукт:

np.einsum('ki,kj->kij',x,-x)

Существуют ли конкретные примеры вычитаний в пакетном режиме или дополнений с увеличенным размером?

...