Skip to main content
 首页 » 编程设计

python之如何根据每行的多个最大值更新矩阵

2025年05月04日14tuyile006

我是 Python 新手。我有一个 NxN 矩阵,我想知道每一行的最大值。接下来,我想取消(更新为零)除此最大值之外的所有其他值。如果该行包含多个最大值,则应保留所有这些最大值。

使用 DataFrame,我尝试获取每一行的最大值。然后我尝试获取这些最大值的索引。代码如下。

 matrix = [(22, 16, 23), 
          (12, 6, 43), 
          (24, 67, 11), 
          (87, 9,11), 
          (66, 36,66) 
          ] 
  dfObj = pd.DataFrame(matrix, index=list('abcde'), columns=list('xyz')) 
  maxValuesObj = dfObj.max(axis=1) 
  maxValueIndexObj = dfObj.idxmax(axis=1) 

上面的代码没有考虑多个最大值。仅返回第一次出现。 另外,我坚持如何相应地更新矩阵。我的预期输出是:

matrix = [(0, 0, 23), 
              (0, 0, 43), 
              (0, 67, 0), 
              (87, 0,0), 
              (66, 0,66) 
              ] 

你能帮我解决这个问题吗?

请您参考如下方法:

使用 df.where() :

dfObj.where(dfObj.eq(dfObj.max(1),axis=0),0) 

    x   y   z 
a   0   0  23 
b   0   0  43 
c   0  67   0 
d  87   0   0 
e  66   0  66 

对于 ND 数组而不是数据帧,调用 .values在上面的代码之后:

dfObj.where(dfObj.eq(dfObj.max(1),axis=0),0).values 

或者更好的是to_numpy() :

dfObj.where(dfObj.eq(dfObj.max(1),axis=0),0).to_numpy() 

或np.where :

np.where(dfObj.eq(dfObj.max(1),axis=0),dfObj,0) 

array([[ 0,  0, 23], 
       [ 0,  0, 43], 
       [ 0, 67,  0], 
       [87,  0,  0], 
       [66,  0, 66]], dtype=int64)