np.choose广播后没有给出想要的结果

时间:2016-10-31 12:02:00

标签: python numpy numpy-broadcasting

我想从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]]])

2 个答案:

答案 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]])