我想从suitCounts中选择maxsuit中指定的第n个元素。我确实播放了maxsuit数组,所以我得到了一个结果,但不是想要的结果。任何建议我在做什么概念上的错误是值得赞赏的。我不明白public void enter(String aName, int aHandicap) {
players.add(new Player(aName, aName));
}
的结果,这不是我想要的。
np.choose(self.maxsuit[:,:,None]-1, self.suitCounts)
期望的结果是:
>>> self.maxsuit
Out[38]:
array([[3, 3],
[1, 1],
[1, 1]], dtype=int64)
>>> self.maxsuit[:,:,None]-1
Out[33]:
array([[[2],
[2]],
[[0],
[0]],
[[0],
[0]]], dtype=int64)
>>> self.suitCounts
Out[34]:
array([[[2, 1, 3, 0],
[1, 0, 3, 0]],
[[4, 1, 2, 0],
[3, 0, 3, 0]],
[[2, 2, 0, 0],
[1, 1, 1, 0]]])
>>> np.choose(self.maxsuit[:,:,None]-1, self.suitCounts)
Out[35]:
array([[[2, 2, 0, 0],
[1, 1, 1, 0]],
[[2, 1, 3, 0],
[1, 0, 3, 0]],
[[2, 1, 3, 0],
[1, 0, 3, 0]]])
答案 0 :(得分:1)
您可以使用advanced-indexing
作为广播方式索引数组,如下所示 -
In [415]: val # Data array
Out[415]:
array([[[2, 1, 3, 0],
[1, 0, 3, 0]],
[[4, 1, 2, 0],
[3, 0, 3, 0]],
[[2, 2, 0, 0],
[1, 1, 1, 0]]])
In [416]: idx # Indexing array
Out[416]:
array([[3, 3],
[1, 1],
[1, 1]])
In [417]: m,n = val.shape[:2]
In [418]: val[np.arange(m)[:,None],np.arange(n),idx-1]
Out[418]:
array([[3, 3],
[4, 3],
[2, 1]])
使用np.ogrid
使用开放范围数组的一种更清洁的方法 -
In [424]: d0,d1 = np.ogrid[:m,:n]
In [425]: val[d0,d1,idx-1]
Out[425]:
array([[3, 3],
[4, 3],
[2, 1]])
答案 1 :(得分:0)
这是我选择
时能做的最好的事情In [23]: np.choose([[1,2,0],[1,2,0]], suitcounts[:,:,:3])
Out[23]:
array([[4, 2, 3],
[3, 1, 3]])
choose
更喜欢我们使用数组列表,而不是单个数组。它应该防止滥用。所以问题可以写成:
In [24]: np.choose([[1,2,0],[1,2,0]], [suitcounts[0,:,:3], suitcounts[1,:,:3], suitcounts[2,:,:3]])
Out[24]:
array([[4, 2, 3],
[3, 1, 3]])
这个想法是根据索引数组从3个子数组中选择项目:
In [25]: np.array([[1,2,0],[1,2,0]])
Out[25]:
array([[1, 2, 0],
[1, 2, 0]])
输出将匹配索引数组的形状。选择数组的形状也匹配,因此我使用了[...,:3]
。
第一列的值从suitcounts[1,:,:3]
中选择,第suitcounts[2...]
页的第二列等。
choose
限制为32种选择;这是广播机制施加的限制。
说到广播我可以简化表达
In [26]: np.choose([1,2,0], suitcounts[:,:,:3])
Out[26]:
array([[4, 2, 3],
[3, 1, 3]])
广播[1,2,0]
以匹配子阵列的2x3形状。
我可以通过重新排序列来获取目标订单:
In [27]: np.choose([0,1,2], suitcounts[:,:,[2,0,1]])
Out[27]:
array([[3, 4, 2],
[3, 3, 1]])