有没有一种快速的方法来创建一个numpy数组,将唯一值减少到最低形式?

Bre*_*dan 3 python arrays numpy multidimensional-array

对不起,如果问题措辞混乱.我有一个类似于以下的数组: [[3,7,9,5],[3,3,7,5]]虽然更大.

如何将其转换为一种形式,例如[[0,2,3,1],[0,0,2,1]]从最低的每个唯一值给出一个标识号,从0开始?目前我正在使用for循环,但它非常慢.numpy中是否有任何可以加快速度的功能?

Div*_*kar 5

我们可以使用一种方法,使用np.unique其可选的arg return_inverseset作为True.这会在输入时使输入变得扁平,从而为我们提供从中开始的唯一ID 0.数组中的所有元素都保持唯​​一性,因为它是扁平的.因此,输出需要重新塑造,以使其恢复到与输入相同的形状.

因此,实施将是 -

np.unique(a, return_inverse=True)[1].reshape(a.shape)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [208]: a = np.array([[3,7,9,5],[3,3,7,5]])

In [209]: np.unique(a, return_inverse=True)[1].reshape(a.shape)
Out[209]: 
array([[0, 2, 3, 1],
       [0, 0, 2, 1]])
Run Code Online (Sandbox Code Playgroud)