给定如下格式的numpy数组:
'aa', '1'
'ab', '1'
'ab', '1'
'ba', '2'
'ba', '2'
可以用numpy。唯一的直方图每个列的元素单独。通过对第一列的直方图,我可以得到第一列中元素的唯一计数如下:
'aa' = 1; 'ab' = 2; 'ba' = 2.
对第二列进行直方图将得到
'1' = 3; '2' = 2.
我想用第二列直方图的输出对第一列直方图的输出进行规范化,得到:
'aa' = 1/3; 'ab' = 2/3; 'ba' = 2/2;
是否有一个好的方法来实现这一点?
首先获取每个数字的计数和唯一值,并将其转换为查找字典
unique_vals, counts = np.unique(arr[:,1],return_counts=True)
freq = 1 / counts
lookup = dict(zip(unique_vals, freq))
获取对应频率的numpy数组,然后查找数组中的每个唯一字母并将频率求和。
freqs = np.vectorize(lookup.get)(arr[:,1])
unique_letters = np.unique(arr[:,0])
{ letter: np.sum(freqs[letter==arr[:,0]]) for letter in unique_letters}
返回{'aa': 0.3333333333333333, 'ab': 0.6666666666666666, 'ba': 1.0}