如何清空除argmax之外的所有条目?

2024-03-29 07:00:46 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个像a=[1,2,3,4,5]这样的矩阵/数组/列表,并且我想使除max之外的所有条目都为空,所以它应该是a=[0,0,0,0,5]。你知道吗

我正在使用b = [val if idx == np.argmax(a) else 0 for idx,val in enumerate(a)],但是有没有更好(更快)的方法(特别是对于一维以上的数组…)


Tags: 方法in列表forifnp条目矩阵
2条回答

您可以使用numpy作为就地解决方案。请注意,下面的方法将使所有匹配最大值等于0。你知道吗

import numpy as np

a = np.array([1,2,3,4,5])

a[np.where(a != a.max())] = 0

# array([0, 0, 0, 0, 5])

有关唯一最大值,请参见@cᴏʟᴅsᴘᴇᴇᴅ's solution。你知道吗

您可以创建一个零数组,并适当地设置正确的索引,而不是掩蔽?你知道吗

1-D(优化)解决方案

(设置)将a转换为1D数组:a = np.array([1,2,3,4,5])。你知道吗

  1. 只替换max的一个实例

    b = np.zeros_like(a)
    i = np.argmax(a)
    b[i] = a[i]
    
  2. 替换max的所有实例

    b = np.zeros_like(a)
    m = a == a.max()
    b[m] = a[m]
    

N-D解决方案

np.random.seed(0)
a = np.random.randn(5, 5)

b = np.zeros_like(a)
m = a == a.max(1, keepdims=True)
b[m] = a[m]

b
array([[0.        , 0.        , 0.        , 2.2408932 , 0.        ],
       [0.        , 0.95008842, 0.        , 0.        , 0.        ],
       [0.        , 1.45427351, 0.        , 0.        , 0.        ],
       [0.        , 1.49407907, 0.        , 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.        , 2.26975462]])

适用于每行max的所有实例。你知道吗

相关问题 更多 >