【问题标题】:Finding a numpy mode vector找到一个 numpy 模式向量
【发布时间】:2017-09-07 18:15:52
【问题描述】:

我有一个单热向量的 numpy 数组。我想找到这些 one-hot 向量的模式。请注意,这并不等同于在值上找到模式。

例如对于

x = [[0,0,0,1],
     [0,0,0,1],
     [0,0,1,0],
     [0,1,0,0],
     [1,0,0,0]]

assert vector_mode(x) == [0,0,0,1]
assert scipy.stats.mode(x) == [0,0,0,0]

使用 numpy/scipy 最有效的方法是什么?

【问题讨论】:

  • 为什么要多出一组括号?
  • 我希望我的列表括号对齐。 =c)
  • 你可能最终不得不lexsort它并找到最长的相等行。
  • 这里的关键是这些是 one-hot 向量。让生活更轻松。
  • 当我们谈到这个话题时,我想指出 scipy.stats.mode 有一个 loop in it 将数组中找到的每个值与整个数组进行比较,这可能会导致非常糟糕的结果具有许多不同值的数组的性能。例如,scipy.stats.mode(range(10**5)) 速度非常慢。

标签: python numpy scipy


【解决方案1】:

我们将one-hot 向量作为2D 输入数组的行来处理。因此,每行的 argmax 对于每个单热向量都是唯一的。得到那些。然后,得到他们的计数。具有最大 argmax 计数的任何行都将是所需的模式行输出。让我们从更多使用argmax 的那些中挑选第一个,最后索引到2D 输入。

因此,一种实现方式 -

idx = np.argmax(x,1)
count = np.bincount(idx)
out = x[(idx==count.argmax()).argmax()]

【讨论】:

    【解决方案2】:

    如果你的向量是 one-hot,你可以使用 argmax 来获取热点的索引并计算它们的模式:

    hot = np.argmax(x, axis=1)
    mode = scipy.stats.mode(hot).mode
    

    在这种情况下,mode3,这意味着最常见的向量在索引3 中有一个热点。

    如果您想将其恢复为 one-hot 向量,您可以这样做:

    vec = np.zeros(4)
    vec[mode] = 1
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2022-08-14
      • 1970-01-01
      相关资源
      最近更新 更多