将numpy数组更改为从零开始

时间:2014-01-23 00:21:12

标签: arrays python-2.7 numpy

我试图找出一种方法来获取一个整数数组,然后更改条目,使最小值为0,第二个最小值为1,等等。

E.g。

从这个开始

In [13]: a = numpy.array([[1, 2, 10],[1, 2, 99]])

In [14]: a
Out[14]: 
array([[ 1,  2, 10],
       [ 1,  2, 99]])

得到这个:

array([[ 0,  1, 2],
       [ 0,  1, 3]])

我可以通过numpy.unique()开始查看,例如:

In [19]: range(len(b))
Out[19]: [0, 1, 2, 3]

In [20]: b = numpy.unique(a)

In [21]: b
Out[21]: array([ 1,  2, 10, 99])

In [22]: c = range(len(b))

In [23]: c
Out[23]: [0, 1, 2, 3]

似乎我现在应该可以使用b和c从一个数组转换到另一个数组。但是这样做最好(也是最快)的方法是什么?

3 个答案:

答案 0 :(得分:4)

不知道最快,但如果您有scipy可用,则可以使用scipy.stats.rankdata

>>> a = np.array([[1, 2, 10],[1, 2, 99]])
>>> scipy.stats.rankdata(a,'dense').reshape(a.shape)-1
array([[ 0.,  1.,  2.],
       [ 0.,  1.,  3.]])

(需要reshape,因为它首先展平数据,-1,因为它的排名为1。

答案 1 :(得分:2)

最直接的方法是使用argsort()

a = numpy.array([0, 1, 1, 2])
u, ind = numpy.unique(a, return_inverse = True)
u = u.argsort().argsort()
ret = u[ind]

答案 2 :(得分:2)

我会给你两个选择,第一个看起来更干净:

a = numpy.array([[1, 2, 10],[1, 2, 99]])
uniq, inv = numpy.unique(a, return_inverse=True)
result = inv.reshape(a.shape)

我喜欢这个,因为它适用于没有return_inverse的旧版numpy:

a = numpy.array([[1, 2, 10],[1, 2, 99]])
uniq = numpy.unique(a)
result = uniq.searchsorted(a)