如何提取二维数组中出现占比不低于1%的元素?求实现方案
提取二维数组中出现占比≥1%的元素
输入数据
我有一个名为data的二维数组,内容如下:
data = [ ['amazon', 'phone', 'serious', 'mind', 'blown', 'serious', 'enjoy', 'use', 'applic', 'full', 'blown', 'websit', 'allow', 'quick', 'track', 'packag', 'descript', 'say'], ['would', 'say', 'app', 'real', 'thing', 'show', 'ghost', 'said', 'quot', 'orang', 'quot', 'ware', 'orang', 'cloth', 'app', 'adiquit', 'would', 'recsmend', 'want', 'talk', 'ghost'], ['love', 'play', 'backgammonthi', 'game', 'offer', 'varieti', 'difficulti', 'make', 'perfect', 'beginn', 'season', 'player'] ]
需求
将该数组中**出现占比至少1%**的元素保存到列表中。
尝试过的无效代码
使用numpy_indexed的实现代码(未得到预期结果):
import numpy as np import numpy_indexed as npi # 原代码中tokens_list_train对应此处的data idx = [np.ones(len(a))*i for i, a in enumerate(data)] (rows, cols), table = npi.count_table(np.concatenate(idx), np.concatenate(data)) table = table / table.sum(axis=1, keepdims=True) print(table * 100)
问题分析
原代码错误地按每行计算元素占比,而需求是计算元素在整个数组中的全局占比,因此逻辑方向不符。
可行实现方案
方案1:原生Python(collections.Counter)
适合小规模数据,代码简洁直观:
from collections import Counter import itertools # 展平二维数组为一维列表 all_tokens = list(itertools.chain.from_iterable(data)) total_count = len(all_tokens) # 统计每个元素的出现次数 token_counter = Counter(all_tokens) # 筛选占比≥1%的元素 min_ratio = 0.01 result = [token for token, cnt in token_counter.items() if cnt / total_count >= min_ratio] print(result)
方案2:Numpy实现
适合大规模数据,计算效率更高:
import numpy as np # 展平数组 flat_data = np.concatenate(data) # 获取唯一元素及对应出现次数 unique_tokens, counts = np.unique(flat_data, return_counts=True) # 计算总元素数并筛选符合条件的元素 total = flat_data.size min_ratio = 0.01 result = unique_tokens[counts / total >= min_ratio].tolist() print(result)
方案3:修正后的numpy_indexed实现
调整原代码逻辑为全局统计:
import numpy as np import numpy_indexed as npi # 展平数组 flat_data = np.concatenate(data) # 全局统计元素出现次数 unique_tokens, counts = npi.count(flat_data) # 筛选占比≥1%的元素 total = flat_data.size min_ratio = 0.01 result = unique_tokens[counts / total >= min_ratio].tolist() print(result)
内容的提问来源于stack exchange,提问作者Nosequinposar Tampoc
相关产品推荐
相关产品推荐

