【问题标题】:Numpy: filling the non-maximum elements of ndarray with zerosNumpy:用零填充ndarray的非最大元素
【发布时间】:2016-11-01 03:00:35
【问题描述】:

我有一个ndarray,我想将最后一维中的所有非最大元素设置为零。

a = np.array([[[1,8,3,4],[6,7,10,6],[11,12,15,4]],
              [[4,2,3,4],[4,7,9,8],[41,14,15,3]],
              [[4,22,3,4],[16,7,9,8],[41,12,15,43]]
             ])
print(a.shape)
(3,3,4)

我可以通过 np.argmax() 得到最大元素的索引:

b = np.argmax(a, axis=2)
b
array([[1, 2, 2],
       [0, 2, 0],
       [1, 0, 3]])

显然,b 比 a 小 1 维。现在,我想获得一个新的 3-d 数组,除了最大值所在的位置之外,它全为零。

我想得到这个数组:

np.array([[[0,1,0,0],[0,0,1,0],[0,0,1,0]],
          [[1,0,0,1],[0,0,1,0],[1,0,0,0]],
          [[0,1,0,0],[1,0,0,0],[0,0,0,1]]
         ])

实现这一点的一种方法,我尝试创建这些临时数组

b = np.repeat(b[:,:,np.newaxis], 4, axis=2)
t = np.repeat(np.arange(4).reshape(4,1), 9, axis=1).T.reshape(b.shape)

z = np.zeros(shape=a.shape, dtype=int)
z[t == b] = 1
z
array([[[0, 1, 0, 0],
    [0, 0, 1, 0],
    [0, 0, 1, 0]],

   [[1, 0, 0, 0],
    [0, 0, 1, 0],
    [1, 0, 0, 0]],

   [[0, 1, 0, 0],
    [1, 0, 0, 0],
    [0, 0, 0, 1]]])

知道如何以更有效的方式实现这一点吗?

【问题讨论】:

    标签: python arrays numpy argmax


    【解决方案1】:

    这是使用广播的一种方式:

    In [108]: (a == a.max(axis=2, keepdims=True)).astype(int)
    Out[108]: 
    array([[[0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 1, 0]],
    
           [[1, 0, 0, 1],
            [0, 0, 1, 0],
            [1, 0, 0, 0]],
    
           [[0, 1, 0, 0],
            [1, 0, 0, 0],
            [0, 0, 0, 1]]])
    

    【讨论】:

    • 天啊,太好了!非常感谢@Warren :)
    猜你喜欢
    • 2023-01-31
    • 2015-08-09
    • 2019-09-16
    • 2018-06-23
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2017-10-24
    • 2017-12-13
    相关资源
    最近更新 更多