在python中,当一行中存在多个最大值时,在二维向量的每行中查找最大值

在python中,当一行中存在多个最大值时,在二维向量的每行中查找最大值,python,numpy,vector,Python,Numpy,Vector,我正在寻找一种方法来找到一个2维向量中每一行的最大值,并将它的索引保存在另一个向量中。我知道我可以用这个代码做到这一点: max_index = np.argmax(vec, axis=1) 现在我的问题是,当一行有多个最大值时,它会取它的第一个索引。假设我们有这个矩阵: vec = [[1, 0 ,1], [1, 2 ,3], [0, 5 ,5]] 因此,当一行中有多个max时,我想将max的索引替换为-1。 最后,max_索引应该是这样的 max_i

我正在寻找一种方法来找到一个2维向量中每一行的最大值,并将它的索引保存在另一个向量中。我知道我可以用这个代码做到这一点:

    max_index = np.argmax(vec, axis=1)
现在我的问题是,当一行有多个最大值时,它会取它的第一个索引。假设我们有这个矩阵:

vec = [[1, 0 ,1],
       [1, 2 ,3],
        [0, 5 ,5]]
因此,当一行中有多个max时,我想将max的索引替换为-1。 最后,max_索引应该是这样的

max_index = [-1, 2, -1]

提前感谢

也许这可以解决您的问题:

#创建vec的副本
不带最大值的向量=np.拷贝(向量);
#从新副本中删除以前找到的最大值
对于范围内的i(np.形状(vec)[0]):
不带最大值[i][max\u索引[i]]=np.iinfo(不带最大值[i][max\u索引[i]].dtype的向量)。最小值
#查找复制数组上的最大值,但不包含vec的最大值
max\u index\u再次=np.argmax(没有max的向量,轴=1)
#比较这两个数组,如果我们有相同的max值,我们将max_索引设置为-1
对于范围内的i(np.形状(vec)[0]):
如果vec[i][max_index[i]==vec[i][max_index\u再次[i]]:
最大索引[i]=-1
此脚本返回

max_index=[-1,2,-1]

对于您发布的示例,它应该适用于任何维度的数组。

也许这可以解决您的问题:

#创建vec的副本
不带最大值的向量=np.拷贝(向量);
#从新副本中删除以前找到的最大值
对于范围内的i(np.形状(vec)[0]):
不带最大值[i][max\u索引[i]]=np.iinfo(不带最大值[i][max\u索引[i]].dtype的向量)。最小值
#查找复制数组上的最大值,但不包含vec的最大值
max\u index\u再次=np.argmax(没有max的向量,轴=1)
#比较这两个数组,如果我们有相同的max值,我们将max_索引设置为-1
对于范围内的i(np.形状(vec)[0]):
如果vec[i][max_index[i]==vec[i][max_index\u再次[i]]:
最大索引[i]=-1
此脚本返回

max_index=[-1,2,-1]

对于您发布的示例,但它应该适用于任何维度的数组。

技巧:从左到右取
argmax
,检查它们是否一致:

L = np.argmax(vec,1)
R = np.argmax(vec[:,::-1],1)
np.where(L+R==len(vec[0])-1,L,-1)

# array([-1,  2, -1])

诀窍:从左到右取
argmax
,检查它们是否一致:

L = np.argmax(vec,1)
R = np.argmax(vec[:,::-1],1)
np.where(L+R==len(vec[0])-1,L,-1)

# array([-1,  2, -1])

如果最初的问题是找到多个最大值的最后一个索引,那么可以遵循以下方法

方法#1

np.argmax((vec.max(axis=1)[...,None] == vec).cumsum(axis=1), axis=1)
当一行中存在重复的最大值时,将-1作为最后一个索引,将无法为类似[[1,1,0]]的行提供正确的索引

vec.max(轴=1)
给出每行的最大值

vec.max(axis=1)[…,无]
将其转换为二维数组

(vec.max(axis=1)[…,None]==vec)
将每行中的每个元素与每行中的最大值进行比较

(vec.max(axis=1)[…,None]==vec)。累积和(axis=1)
产生累积和,其
argmax
给出最后一个最大值的索引

案例1:
vec=[[1,0,1],[1,2,3],[0,5,5]]
,结果将是:
[2,2,2]

案例二:
vec=[[1,1,0],[1,2,3],[0,5,5]]
,结果将是:
[1,2,2]

方法#2

R = np.argmax(vec[:,::-1],1) # Get the index of max from right side
result = vec.shape[1]-1-R 

在这里,我将反转列,然后取argmax。之后,我将进行调整以获得正确的索引

如果您最初的问题是找到多个最大值的最后一个索引,那么您可以遵循以下方法

方法#1

np.argmax((vec.max(axis=1)[...,None] == vec).cumsum(axis=1), axis=1)
当一行中存在重复的最大值时,将-1作为最后一个索引,将无法为类似[[1,1,0]]的行提供正确的索引

vec.max(轴=1)
给出每行的最大值

vec.max(axis=1)[…,无]
将其转换为二维数组

(vec.max(axis=1)[…,None]==vec)
将每行中的每个元素与每行中的最大值进行比较

(vec.max(axis=1)[…,None]==vec)。累积和(axis=1)
产生累积和,其
argmax
给出最后一个最大值的索引

案例1:
vec=[[1,0,1],[1,2,3],[0,5,5]]
,结果将是:
[2,2,2]

案例二:
vec=[[1,1,0],[1,2,3],[0,5,5]]
,结果将是:
[1,2,2]

方法#2

R = np.argmax(vec[:,::-1],1) # Get the index of max from right side
result = vec.shape[1]-1-R 

在这里,我将反转列,然后取argmax。之后,我将进行调整以获得正确的索引

这是否回答了您的问题?我的问题是每行有多个最大值。我想以某种方式保存它,以便我知道在这一行中存在多个最大值这是否回答了您的问题?我的问题是每行有多个最大值。我想以某种方式保存它,这样我就知道在这一行中有多个maxvalue@Milad但是它对范围内的i使用了
这是很慢的。我认为如果一行只包含负值,这将失败。@fountainhead你是对的。根据这个例子,我假设它只由正数组成。在负数的情况下,他只需要用
vec_不带_max[i][max_index[i]]=0
替换为
vec_不带_max[i][max_index[i]=np.iinfo(vec_不带_max[i][max_index[i].dtype).min
@falfab--Ok。很好的努力。还有一件事——在涉及
numpy
的问题中,尽量消除显式循环。当然,避免循环的具体方法因情况而异。@Mild但它对范围内的i使用
这很慢。我认为如果一行只包含负值,这将失败。@fountainhead你是对的。根据这个例子,我假设它只由正数组成。在负数的情况下,他只需要用
vec_不带_max[i][max_index[i]]=0
替换为
vec_不带_max[i][max_index[i]=np.iinfo(vec_不带_max[i][max_index[i].dtype).min
@falfab--Ok。很好的努力。还有一件事——在涉及