np.unique
имеет ключевое слово return_inverse
, которое можно использовать здесь:
>>> a = np.r_[0:3, 6:9]
>>> D = np.subtract.outer(a, a)
>>> D
array([[ 0, -1, -2, -6, -7, -8],
[ 1, 0, -1, -5, -6, -7],
[ 2, 1, 0, -4, -5, -6],
[ 6, 5, 4, 0, -1, -2],
[ 7, 6, 5, 1, 0, -1],
[ 8, 7, 6, 2, 1, 0]])
>>> unq, bck = np.unique(D, return_inverse=True)
>>> unq
array([-8, -7, -6, -5, -4, -2, -1, 0, 1, 2, 4, 5, 6, 7, 8])
>>> bck
array([ 7, 6, 5, 2, 1, 0, 8, 7, 6, 3, 2, 1, 9, 8, 7, 4, 3,
2, 12, 11, 10, 7, 6, 5, 13, 12, 11, 8, 7, 6, 14, 13, 12, 9,
8, 7])
>>> f_unq = 10 * unq
>>> f_D = f_unq[bck].reshape(6, 6)
>>> f_D
array([[ 0, -10, -20, -60, -70, -80],
[ 10, 0, -10, -50, -60, -70],
[ 20, 10, 0, -40, -50, -60],
[ 60, 50, 40, 0, -10, -20],
[ 70, 60, 50, 10, 0, -10],
[ 80, 70, 60, 20, 10, 0]])