Используйте np.triu
на 3D
расширенной версии вычитаемых массивов -
In [57]: np.triu(X[:,None,:]-X[:,:,None])
Out[57]:
array([[[0, 1, 2],
[0, 0, 1],
[0, 0, 0]],
[[0, 1, 2],
[0, 0, 1],
[0, 0, 0]],
[[0, 1, 2],
[0, 0, 1],
[0, 0, 0]]])
Или используйте trusty np.expand_dims
-
np.triu(np.expand_dims(X, 1) - np.expand_dims(X, 2))
Или создайте маску triu
с чем-то вроде np.tri
и затем маску -
mask = ~np.tri(X.shape[-1], dtype=bool)
out = mask*(X[:,None,:]-X[:,:,None])