Python 查找numpy模式向量

Python 查找numpy模式向量,python,numpy,scipy,Python,Numpy,Scipy,我有一个热向量的numpy数组。我想找到这一个热向量的模式。请注意,这并不等同于在值上查找模式 e、 g.为了 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最有效的方法是什么?如果你的向量是一个热点,你可

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

e、 g.为了

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最有效的方法是什么?

如果你的向量是一个热点,你可以用它来获取热点的索引并计算它们的模式:

hot = np.argmax(x, axis=1)
mode = scipy.stats.mode(hot).mode
在这种情况下,
mode
3
,这意味着最常见的向量在索引
3
中有一个热点

如果要将其恢复为一个热向量,可以执行以下操作:

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

我们将
一个热的
向量处理为
2D
输入数组的行。因此,每一行的argmax对于每一个热向量都是唯一的。去拿。然后,获取他们的计数。具有max argmax count的任何行都将是所需的模式行输出。让我们从那些再次使用
argmax
的人中挑选出第一个,最后索引到
2D
输入

因此,有一个实现-

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

为什么要增加一组参数?我想让我的列表括号排成一行=c) 你可能最终不得不找到最长的等长行。这里的关键是这些是一个热向量。让生活变得更加简单。在我们讨论这个主题时,我想指出,
scipy.stats.mode
有一个比较数组中找到的每个值与整个数组的方法,这可能会导致数组中有许多不同值时的性能异常差。例如,
scipy.stats.mode(范围(10**5))
非常慢。