Если я понимаю, что вы хотите, np_lu должен автоматически генерироваться из ваших данных.
In [24]: np_lu=sorted(set(data.ravel()))
In [25]: np_lu
Out[25]: [2, 6, 16, 39, 43]
Создать массив индексов 2-> 0, 6-> 1, ... 43-> 4
In [29]: indx=np.array(np_lu)
In [33]: d=np.zeros(indx.max()+1)
In [34]: d[indx]=np.arange(len(indx))
In [35]: d
Out[35]:
array([ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 2., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
3., 0., 0., 0., 4.])
In [36]: data
Out[36]:
array([[ 2, 6, 16, 39, 43],
[43, 6, 16, 39, 2]])
Создать массив результатов, res.
In [37]: res=np.zeros_like(data)
Заполнить res данными в d, проиндексированными по данным.
In [41]: res=d[data]
In [42]: res
Out[42]:
array([[ 0., 1., 2., 3., 4.],
[ 4., 1., 2., 3., 0.]])
Это будет работать толькодля данных типа int.Вероятно, в моем коде можно много чего привести.