Python将矢量转换为概率

时间:2018-01-26 07:49:36

标签: python arrays numpy

所以给出了这个numpy数组:

import numpy as np

vector = np.array([1, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 1])  

# len(vector) == 12
# 2 x ones, 4 x two, 6 x three

如何将其转换为概率向量?

结果如下:

array([0.16, 0.33, 0.33, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.33, 0.33, 0.16])

3 个答案:

答案 0 :(得分:2)

这实际上需要一个分组操作,numpy并不是很好......但pandas是。groupby。您可以使用transform + count + len执行此操作,并将结果除以vector的{​​{1}} gth。

import pandas as pd

s = pd.Series(vector)
vector = (s.groupby(s).transform('count') / len(s)).values

vector
array([ 0.16666667,  0.33333333,  0.33333333,  0.5       ,  0.5       ,
        0.5       ,  0.5       ,  0.5       ,  0.5       ,  0.33333333,
        0.33333333,  0.16666667])

答案 1 :(得分:2)

[更新为普通人]

使用np.histogram

的这个怎么样?
import numpy as np

l = np.array([1,2,2,3,3,3,3,3,3,2,2,1])
_u, _l = np.unique(l, return_inverse=True)
np.histogram(_l, bins=np.arange(_u.size+1))[0][_l] / _l.size

答案 2 :(得分:2)

您可以使用collections.Counter来首先确定每个元素的频率。然后创建一个中间映射字典,它将包含键作为元素,值包含频率。最后使用numpy.vectorize将数组转换为所需的格式

>>> import numpy as np
>>> from collections import Counter
>>> v = np.array([1, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 1]) 
>>> freq_dict = Counter(v)

此时freq_dict将包含每个元素的频率,如

>>> freq_dict
>>> Counter({3: 6, 2: 4, 1: 2})

接下来使用dict comprehension

构建格式element: probability的概率字典
>>> prob_dict = dict((k,round(val/len(v),3)) for k, val in freq_dict.items())
>>> prob_dict
>>> {1: 0.167, 2: 0.333, 3: 0.5}

最后使用numpy.vectorize获取所需的输出

>>> out = np.vectorize(prob_dict.get)(v)

这将产生:

>>> out
>>> array([ 0.167,  0.333,  0.333,  0.5, 0.5,  0.5,  0.5, 0.5,
           0.5, 0.333, 0.333, 0.167])