我试图找出一种方法来获取一个整数数组,然后更改条目,使最小值为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从一个数组转换到另一个数组。但是这样做最好(也是最快)的方法是什么?
答案 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)