如何在多个矩阵中有效地分别为每个元素找到 N 个最大值?
How to efficiently find separately for each element N maximum values among multiple matrices?
我正在遍历大量 H x W 矩阵。我无法将它们全部存储在内存中。我需要得到 N 个矩阵。例如,1st of N matrix 在位置 (i, j) 的元素将是所有处理过的 matrix 矩阵中位置 (i, j) 的所有元素中最大的。对于N矩阵的第二个,取第二大的元素,以此类推。
示例。
令 N = 2。那么第一个矩阵将如下所示。
而第二个矩阵是这样的
如何在循环中做这样的操作,才不会把所有的矩阵都存储在内存中?
评论建议使用np.partition
功能。我用使用 GPU 的 cupy 替换了 numpy 的使用。并且还添加了一个缓冲区来减少排序。
import cupy as np
buf = // # As much as fits into the GPU
largests = np.zeros((buf + N, h, w))
for i in range(num):
val = //
largests[i % buf] = val
if i % buf == buf - 1:
largests.partition(range(buf, buf + N), axis=0)
largests.partition(range(buf, buf + N), axis=0) # Let's not forget the tail
res = largests[:-(N + 1):-1]
该解决方案的工作速度不是很快,但我已经接受了这种速度。
我正在遍历大量 H x W 矩阵。我无法将它们全部存储在内存中。我需要得到 N 个矩阵。例如,1st of N matrix 在位置 (i, j) 的元素将是所有处理过的 matrix 矩阵中位置 (i, j) 的所有元素中最大的。对于N矩阵的第二个,取第二大的元素,以此类推。
示例。
令 N = 2。那么第一个矩阵将如下所示。
而第二个矩阵是这样的
如何在循环中做这样的操作,才不会把所有的矩阵都存储在内存中?
评论建议使用np.partition
功能。我用使用 GPU 的 cupy 替换了 numpy 的使用。并且还添加了一个缓冲区来减少排序。
import cupy as np
buf = // # As much as fits into the GPU
largests = np.zeros((buf + N, h, w))
for i in range(num):
val = //
largests[i % buf] = val
if i % buf == buf - 1:
largests.partition(range(buf, buf + N), axis=0)
largests.partition(range(buf, buf + N), axis=0) # Let's not forget the tail
res = largests[:-(N + 1):-1]
该解决方案的工作速度不是很快,但我已经接受了这种速度。