NumPy:排序3D数组,但将第二维分配给first

尼克皮克

我有一个数组,代表玩家持有的扑克牌。每个玩家持有6张牌,这些牌的值为1-12,相应的花色为1-4。

例如,第一个玩家将持有以下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矩阵运算即可。

斯文泽尔

首先,您需要一个可用于对卡片进行排序的值。一个简单的是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.]]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将值分配给二维python数组中的单个单元格

在3D矩阵的第二维上排序

快速将值分配给二维数组

如何在Java中随机将显式值分配给二维数组

C:将二维数组分配给另一个数组

在类方法中分配给二维数组

如何将一维数组分配给二维数组?

程序在for循环的中间以状态-1073741510终止,将输入分配给二维数组

将值分配给动态多维数组的第一维和第二维时,VBA下标超出范围

将列表中的每个值分配给二维数组

C#将一维数组分配给具有偏移值的二维数组

如何将二维变量分配给数组

如何将记录集值分配给二维数组

PHP POST数据分配给二维数组

将二维numpy数组放入3维数组

无法将值分配给二维布尔数组

如何将多维数组分配给二维数组?

如何将匹配表达式的值分配给 Scala 中的二维数组元素?

分配给二维 NumPy 数组的切片

将双精度分配给双精度二维数组 C 编程时出现接收错误

通过引用将较小的二维数组分配给较大的二维数组

将 Numpy 数组的第 3 维分配给 1D 数组的 Pythonic 方法

如何将二维数组变量分配给 Swift 中的大浮点矩阵?

我在 RUBY 中的二维数组有问题,它没有将值分配给它

将numpy 3d数组中的第i个二维矩阵与二维数组中的第i列相乘

如何使用 CudaMallocHost 将固定内存分配给二维数组?

Python:将值分配给具有设置元素的二维列表数组

尝试将字符分配给二维字符数组时,表示数组值的整数在 for 循环内增加

将二维数组值分配给变量