2016-03-24 18 views
1

İki boyutlu bir numpy dizilim var ve yeni bir 2 boyutlu numpy dizisi oluşturabilirim, orijinal 2d dizisindeki tüm öğelerini temel alan değerlerin sıralamasını nasıl temsil edebileceğimi merak ediyorum.Numpy Array Rank Tüm Unsurlar

Ben şu diziyi kullanmak istiyorum:

anOrder = [[ 6, 4, 9, 8, 8] 
      [ 2, 1, 7, 5, 4] 
      [ 3, 3, 8, 7, 8] 
      [ 4, 4, 7, 7, 8] 
      [ 3, 4, 7, 8, 9]] 

teşekkür ederiz:

anArray = [[ 18.5, 25.9, 7.4, 11.1, 11.1] 
      [ 33.3, 37. , 14.8, 22.2, 25.9] 
      [ 29.6, 29.6, 11.1, 14.8, 11.1] 
      [ 25.9, 25.9, 14.8, 14.8, 11.1] 
      [ 29.6, 25.9, 14.8, 11.1, 7.4]] 

[Tüm değerler üzerinde ve birden numaraları için aynı sıralamaya sahip tabanlı] Yeni bir rütbe sipariş verilmiş bir dizi oluşturmak için .

cevap

2
, diğer unsurların yanı sıra benzersizliği bağlı olarak her eleman etiketleri şöyle onun isteğe bağlı argüman return_inverse ile np.unique için rutin işleri var

-

_,id = np.unique(anArray,return_inverse=True) 
out = (id.max() - id + 1).reshape(anArray.shape) 

Numune koşmak -

In [17]: anArray 
Out[17]: 
array([[ 18.5, 25.9, 7.4, 11.1, 11.1], 
     [ 33.3, 37. , 14.8, 22.2, 25.9], 
     [ 29.6, 29.6, 11.1, 14.8, 11.1], 
     [ 25.9, 25.9, 14.8, 14.8, 11.1], 
     [ 29.6, 25.9, 14.8, 11.1, 7.4]]) 

In [18]: _,id = np.unique(anArray,return_inverse=True) 

In [19]: (id.max() - id + 1).reshape(anArray.shape) 
Out[19]: 
array([[6, 4, 9, 8, 8], 
     [2, 1, 7, 5, 4], 
     [3, 3, 8, 7, 8], 
     [4, 4, 7, 7, 8], 
     [3, 4, 7, 8, 9]]) 
3

kullanabilirsiniz method='dense' ile scipy.stats.rankdata. düzleştirilmiş girişinin değerlerini sıralar, böylece rankdata tarafından döndürülen dizinin şeklini geri yüklemeniz gerekir. Örneğin

, rankdata 0'dan başlayarak alçaktan yükseğe doğru sırada, yani sıralarında r ters ve hat ranks = (r.max()+1) - r ile 1 'de başlayacak şekilde ayarlanmış olduğu

In [21]: anArray 
Out[21]: 
[[18.5, 25.9, 7.4, 11.1, 11.1], 
[33.3, 37.0, 14.8, 22.2, 25.9], 
[29.6, 29.6, 11.1, 14.8, 11.1], 
[25.9, 25.9, 14.8, 14.8, 11.1], 
[29.6, 25.9, 14.8, 11.1, 7.4]] 

In [22]: a = np.array(anArray) 

In [23]: r = rankdata(a, method='dense').reshape(a.shape) 

In [24]: ranks = (r.max()+1) - r 

In [25]: ranks 
Out[25]: 
array([[6, 4, 9, 8, 8], 
     [2, 1, 7, 5, 4], 
     [3, 3, 8, 7, 8], 
     [4, 4, 7, 7, 8], 
     [3, 4, 7, 8, 9]]) 

not edin.