我想找到沿轴= 0的2D数组的最大值,并且我不想在行索引处包含该值。我对这种解决方案不满意,因为我需要在一百万行上运行它,并且我不想在这里使用for循环。我尝试了numpy.argmax,但它计算的是行的最大值,包括行索引处的值。
我的2D阵列
Arry=([[1, 0.5, 0.3, 0, 0.2],
[0, 1, 0.2, 0.8, 0],
[0, 1, 1, 0.3, 0],
[0, 0, 0, 1, 0]])
预期产量
[1, 3, 1]
第一行[1,0.5,0.3,0,0.2]在索引1处具有最大值,即0.5,因为值1在行索引0处,类似地,在第二行中最大值是0.8,即索引3和第四行没有最大值,因为都为零
我的代码
import numpy as np
for idx,subarry in enumerate(Arry):
newlist=np.delete(subarry, idx)
idx_min=min(np.where(subarry==np.max(newlist))[0])
if idx_min != 0: min_elem_idx.append(idx_min)
print(min_elem_idx)
[1, 3, 1]
我正在寻找一种不使用for循环的Pythonic方法
答案 0 :(得分:2)
这应该可以解决问题:
a = np.array([[1, 0.5, 0.3, 0, 0.2],
[0, 1, 0.2, 0.8, 0],
[0, 1, 1, 0.3, 0],
[0, 0, 0, 1, 0]])
# Create an array of ones the same size as a
b = np.ones_like(a)
# Fill the diagonal of b with NaN
np.fill_diagonal(b, np.nan)
# Multiply the arrays in order to remove the index column from the max
c = a*b
# Find the index of the max value of every row (excluding the index value)
np.nanargmax(c, axis=1)
输出:
array([1, 3, 1, 0])
为了过滤出每个值均为零(因此定义为“没有最大值”)的情况,您将不得不做一些额外的工作。