【问题标题】:How to efficiently find separately for each element N maximum values among multiple matrices?如何有效地为多个矩阵中的每个元素分别找到 N 个最大值?
【发布时间】:2021-04-04 00:41:03
【问题描述】:

我正在循环大量 H x W 矩阵。我无法将它们全部存储在内存中。我需要得到 N 个矩阵。例如,在所有已处理的矩阵矩阵的位置 (i, j) 中的所有元素中,位置 (i, j) 中的第 N 个矩阵的元素将是最大的。对于 N 矩阵中的第二个,取第二大的元素,以此类推。

示例。

令 N = 2。那么第一个矩阵将如下所示。

而第二个矩阵是这样的。

如何在循环中做这样的操作,以免把所有的矩阵都存入内存?

【问题讨论】:

  • 您要对矩阵进行排序吗?
  • @Kevin,我不明白你的问题。这个问题可以通过对所有矩阵进行排序并取一个切片来解决。但问题是所有矩阵都必须存储在内存中。与排序相比,可以在循环的一次循环中找到 N = const 最大值。
  • @QuangHoang,是的,你是对的。我什至可以尝试实现一个简单的算法。但是numpy可以让你方便高效的向量化操作,我想知道一个简单但有效的解决方案。
  • np.partition,但这也需要将所有内容都放在内存中。我不认为np 对流数据有任何优势。

标签: python algorithm numpy matrix memory-efficient


【解决方案1】:

cmets 建议使用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]

解决方案不是很快,但我已经接受了这个速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2022-06-30
    相关资源
    最近更新 更多