2016-03-23 23 views
1

Oyuncular tarafından tutulan poker kartlarını temsil eden bir dizim var. Her oyuncu 6 kart içerir ve kartlar 1-12 arasında bir değere sahiptir ve 1-4'lük bir karşılık gelir.NumPy: 3B dizilimi sıralama ama 2. boyuta ayarlanmış tutulması ilk

örneğin ilk oyuncu aşağıdaki 7 kartlarını yapacağını:

deck=np.array([[[ 6., 2.], 
       [ 10., 1.], 
       [ 5., 1.], 
       [ 9., 2.], 
       [ 4., 1.], 
       [ 3., 2.], 
       [ 11., 2.]]]) 

Benim sorunum şimdi ben bir karşılık gelen elbiseyle bu durumda 11 en yüksek değere sahiptir (görmek için kartları sıraladığınızda 2)

sortedcards=-np.sort(-unsortedCards,axis=1) 

sadece birinci sütundaki değerleri sıralamak değil, aynı zamanda ikinci olanlar (uygun olan).

Yalnızca ilk sütunu nasıl sıralayabilirim ve ilk sütuna atanan ikinci sütunu nasıl tutabilirim ki, hangi değerlerin uygun olduğuna dair bilgileri kaybetmem.

Lütfen yukarıdaki örnekte sadece bir oyuncu olduğunu unutmayın, ancak birkaç oyuncu olacaktır. Yani dizinin ek bir boyutu var.

Önemli: Çözüm, yalnızca salt NumPy matris işlemi ile gerçekleştirilmelidir.

cevap

1

Önce kartlarınızı sıralamak için kullanabileceğiniz tek bir değere ihtiyacınız var. Kolay bir value*4 + suit olacaktır:

sortval = deck[:,:,0]*4+deck[:,:,1] 
sortval *= -1 # if you want largest first 

Sonra nereye ait olduğu endeks öğrenmek ve deste sıralamak için kullanmak np.argsort kullanın. Varsayılan olarak son eksende sıralar, istediğimiz budur.

sortedIdx = np.argsort(sortval) 

Şimdi böyle güverte sıralamak için kullanabilirsiniz:

deck = deck[np.arange(len(deck))[:,np.newaxis],sortedIdx] 

np.arange... kısım sortedIdx gelen her saniye boyut dizin dizi sağ ilk boyut indeksi ile eşleştirilmiş olduğundan emin olur.

her şey:

import numpy as np 

deck = np.array([[[ 6., 2.], 
        [ 10., 1.], 
        [ 5., 1.], 
        [ 9., 2.], 
        [ 4., 1.], 
        [ 3., 2.], 
        [ 11., 2.]], 

       [[ 6., 2.], 
        [ 2., 2.], 
        [ 2., 3.], 
        [ 11., 1.], 
        [ 11., 3.], 
        [ 5., 3.], 
        [ 4., 4.]]]) 

sortval = deck[:,:,0]*4+deck[:,:,1] 
sortval *= -1 # if you want largest first 
sortedIdx = np.argsort(sortval) 
deck = deck[np.arange(len(deck))[:,np.newaxis],sortedIdx] 
print(deck) 

yazdırmak Will:

[[[ 11. 2.] 
    [ 10. 1.] 
    [ 9. 2.] 
    [ 6. 2.] 
    [ 5. 1.] 
    [ 4. 1.] 
    [ 3. 2.]] 

[[ 11. 3.] 
    [ 11. 1.] 
    [ 6. 2.] 
    [ 5. 3.] 
    [ 4. 4.] 
    [ 2. 3.] 
    [ 2. 2.]]] 
0

yalnızca bir en yüksek değere sahip wich görmek için değerler sıralama musunuz ?? bu durumda neden np.max kullanmadığı için() ?:

deck=np.array([[[ 6., 2.], 
       [ 10., 1.], 
       [ 5., 1.], 
       [ 9., 2.], 
       [ 4., 1.], 
       [ 3., 2.], 
       [ 11., 2.]], 
      [[ 7., 2.], 
       [ 8., 1.], 
       [ 1., 1.], 
       [ 9., 2.], 
       [ 4., 1.], 
       [ 3., 2.], 
       [ 12., 2.]]]) 

np.max(deck) 
Out[4]: 12.0 

np.max(deck[0]) 
Out[5]: 11.0 
+0

Ben en geç bir Yani maksimum daha neeeded olan bir çift, iki çift, floş, ful, düz vb olan bulmalıyız – Nickpick