0

I'm having troubles in using a broadcasting subtraction. My problem is the following. I have an array x of shape [L,N], where L is an integer and N is the number of variables of my problem. I need to compute a [L,N,N] array where at each element l,i,j it contains x[l,i]-x[l,j]. If L=1 this is equivalent to run broadcasting on subtraction: x-x.T

For example here with L=1 and N=3:

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

However, if one increases the dimension L things become more complicated and enter the realm of the np.einsum function. So I tried to recreate my example, in the case L=2, where I've replicated the two rows. What I'd expect is to get a 2x3x3 array with two 3x3 matrices with equal elements.

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)

which returns

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

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

But how to make this with numpy einsum? I can only obtain the product:

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

Are there specific examples of numpy batched subtractions or additions with increased dimension?

linello
  • 8,451
  • 18
  • 63
  • 109
  • 2
    `einsum` is an extension of the matrix product - multiply certain combinations of axes, and sum some the resulting ones. It doesn't implement other operators. – hpaulj Apr 01 '19 at 15:30
  • 3
    You don't need einsum. Simply extend and subtract - `x[:,:,None]-x[:,None,:]` or `x[...,None]-x[:,None]`. – Divakar Apr 01 '19 at 15:30

0 Answers0