【发布时间】:2014-07-07 23:43:12
【问题描述】:
我的数据是这样的:
data = {'x':Counter({'a':1,'b':45}), 'y':Counter({'b':1, 'c':212})}
我的标签是data 的键,而内部字典的键是特征:
all_features = ['a','b','c']
all_labels = ['x','y']
我需要这样创建列表列表:
[[data[label][feat] for feat in all_features] for label in all_labels]
[出]:
[[1, 45, 0], [0, 1, 212]]
我的 len(all_features) 约为 5,000,000,len(all_labels) 约为 100,000
最终目的是创建scipy稀疏矩阵,例如:
from collections import Counter
from scipy.sparse import csc_matrix
import numpy as np
all_features = ['a','b','c']
all_labels = ['x','y']
csc_matrix(np.array([[data[label][feat] for feat in all_features] for label in all_labels]))
但是循环遍历一个大列表是相当低效的。
那么如何有效地查看大列表?
是否有其他方法可以从 data 创建 scipy 矩阵,而无需遍历所有特征和标签?
【问题讨论】:
-
我看不出如果您使用纯 python,列表创建本身会更快,因为字典查找已经是常数时间。您是否尝试过使用元素的静态类型(例如 Cython?)这样,您可能可以在初始化 numpy 数组时避免对列表元素进行类型检查(但我不确定这是否是第一个瓶颈地点)
-
我对@987654331@/
scipy的了解不够多,无法评论如何正确“矢量化”您的操作,但您正在实现一个包含 500 十亿个的列表> 元素之前将其提供给 numpy.看看给np.fromiter一个生成器表达式是否对你来说更快。 -
使用
operator.itemgetter获得了一个快 100 毫秒的解决方案,但我认为这对于非常大的数据集来说是不够的。 db.tt/jMDAxs7i
标签: python list matrix scipy nested-lists