很抱歉,如果问题措辞混乱。我有一个类似于以下的数组:
[[3,7,9,5],[3,3,7,5]]
虽然要大得多。
如何将其转换为[[0,2,3,1],[0,0,2,1]]
这样的形式,其中以最低值开头的每个唯一值都会给出一个标识号,从0开始?目前我正在使用for循环,但它非常慢。 numpy中是否有任何可以加快速度的功能?
答案 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]])