所以给出了这个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])
答案 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])