如何将给定NumPy数组转换为逆频率向量?
将NumPy向量转换为频率/逆频率向量
看起来你给出的示例输出其实是每个值的出现频率(即出现次数除以总长度),而不是你描述的“频率的倒数”。我先按照你提供的示例输出需求给出解决方案,同时也会补充如果确实需要频率倒数的实现方式。
方法一:生成示例中的频率向量
import numpy as np vector = np.array([1, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 1]) # 1. 统计每个值的出现次数 counts = np.bincount(vector) # 解释:np.bincount会统计非负整数数组中每个值的出现次数,索引对应原数值,这里counts是array([0, 2, 4, 6]) # 0出现0次,1出现2次,2出现4次,3出现6次 # 2. 根据原向量的元素获取对应次数,再除以总长度得到频率 freq_vector = counts[vector] / len(vector) # 3. 可选:保留两位小数,和示例输出一致 freq_vector_rounded = np.round(freq_vector, 2) print(freq_vector_rounded) # 输出: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])
方法二:生成真正的逆频率向量(频率的倒数)
如果你确实需要每个值的出现频率的倒数,可以这样实现:
import numpy as np vector = np.array([1, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 1]) # 总长度 total_len = len(vector) # 统计每个值的出现次数 counts = np.bincount(vector) # 计算频率的倒数:总长度 / 出现次数(因为频率=count/total_len,倒数就是total_len/count) inv_freq_vector = total_len / counts[vector] print(inv_freq_vector) # 输出:array([6., 3., 3., 2., 2., 2., 2., 2., 2., 3., 3., 6.])
为什么用np.bincount?
np.bincount是NumPy中统计整数出现次数的高效函数,比循环遍历或者用collections.Counter再映射要快得多,尤其当数组规模很大时,优势更明显。
内容的提问来源于stack exchange,提问作者James Schinner
相关产品推荐
相关产品推荐

