我有一个规模约为10000行和10000列的大型`numpy`浮点类型矩阵。对于每一行,我需要找到具有最大值的列索引,并且每个列最多只选择一次。
例如,对于给定的数组`arr`,我需要将输出作为`(行索引,列索引)`元组的`list`/`array`,如`out`所示:
例如,对于给定的数组`arr`,我需要将输出作为`(行索引,列索引)`元组的`list`/`array`,如`out`所示:
arr = np.array(
[[0.86, 0.23, 0.83, 0.79],
[0.15, 0.98, 0.86, 0.47],
[1. , 0.08, 0.01, 0.04],
[0.78, 0.82, 0.17, 0.56],
[0.73, 0.91, 0.52, 0.31]])
out = [(0,0),(1,1),(2,3),(3,2)]
说明:
- 初始时
out
为空。 - 对于
row 0
,在column 0
中最大值为0.86
,因此out
现在为[(0,0)]
- 对于
row 1
,在column 1
中最大值为0.98
,而且column 1
还没有在out
中出现过,因此out
现在为[(0,0),(1,1)]
- 对于
row 2
,在column 0
中最大值是1
,但是column 0
已经被选择了,所以我们查找下一个最大值,即column 1
中的0.08
,它也出现在out
中,然后是下一个最大值,即column 3
中的0.04
,因此out
现在为[(0,0),(1,1),(2,3)]
- 同样地,对于
row 3
,最大值还未被选择的列是column 2
,因此最终的out
为[(0,0),(1,1),(2,3),(3,2)]
我希望尽可能高效地计算它。使用两个for
循环的O(n
2)
解决方案很简单,因此任何比这更好的解决方案(无论是更好的时间复杂度还是使用内置的numpy
函数更好的运行时)都将非常有帮助。
-np.inf
替换np.zeros(len(arr[:,maxcol]))
。这样更快更干净。 - Lukas S