2016-03-23 29 views
1

我有一个数组,代表玩家持有的扑克牌。每个玩家持有6张牌,牌值为1-12,并有相应的套装1-4。NumPy:排序3D阵列,但保持第二维分配到第一个

例如第一个玩家将举行以下7张牌:

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

我现在的问题是,当我的卡进行排序,看看哪一个具有最高值(在这种情况下,11与相应的西装2)

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

它不仅对第一列中的值进行排序,而且还对第二列中的值进行排序(这是套装)。

如何才能排序第一列,并将第二列分配给第一列,以便我不会丢失哪些值具有适合的信息?

请注意,上述示例仅适用于一名玩家,但会有多名玩家。所以数组有一个额外的维度。

重要提示:解决方案只能通过纯NumPy矩阵操作。

回答

1

首先,您需要一个可用于排序卡的单个值。 一个简单的人会value*4 + suit

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

然后使用np.argsort找出哪些指标所属的地方,并用它来你的甲板排序。它沿着默认的最后一个轴排序,这就是我们想要的。现在

sortedIdx = np.argsort(sortval) 

,你可以用它来你的甲板排序是这样的:

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

np.arange...部分可以确保从sortedIdx每第二个维度索引阵列与右第一维指数配对。

整个事情:

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) 

会打印:

[[[ 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

你排序值只看到一个至极具有最高的价值? 因为在这种情况下,为什么不使用np.max()?:

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

后来我需要找到哪一个有一对,两对,同花顺,满堂红,直等于是多了最大的neeeded – Nickpick

相关问题