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

时间:2017-07-19 19:07:12

标签: python arrays numpy multidimensional-array

很抱歉,如果问题措辞混乱。我有一个类似于以下的数组: [[3,7,9,5],[3,3,7,5]]虽然要大得多。

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

1 个答案:

答案 0 :(得分:5)

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

因此,实施将是 -

np.unique(a, return_inverse=True)[1].reshape(a.shape)

示例运行 -

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]])