x/y坐标稀疏列表的Python数据结构

x/y坐标稀疏列表的Python数据结构,python,data-structures,Python,Data Structures,考虑x/y坐标列表和字节“计数”。x/y的范围可能在0到5000之间,即2500万个单元 然而,数据将非常稀少,最多会有几千个条目,大多数坐标将没有条目 偶尔会查找/添加结构(例如,如果x=5和y=10中有某个内容,则为++),但更频繁地转换为x/y/计数列表(排序不重要) 查找最快的数据结构显然是一个2d数组,但您需要24MB左右的内存,而输出列表的迭代可能会很昂贵。对于磁盘存储,您可以实现gif格式的压缩,其中0字节后跟另一个字节表示x个空单元格,其他任何内容都是单元格值,但这对内存状况没有

考虑x/y坐标列表和字节“计数”。x/y的范围可能在0到5000之间,即2500万个单元

然而,数据将非常稀少,最多会有几千个条目,大多数坐标将没有条目

偶尔会查找/添加结构(例如,如果x=5和y=10中有某个内容,则为++),但更频繁地转换为x/y/计数列表(排序不重要)

查找最快的数据结构显然是一个2d数组,但您需要24MB左右的内存,而输出列表的迭代可能会很昂贵。对于磁盘存储,您可以实现gif格式的压缩,其中0字节后跟另一个字节表示x个空单元格,其他任何内容都是单元格值,但这对内存状况没有帮助

字典的字典可能是查找/迭代速度和内存使用之间的良好平衡

我是否应该考虑其他合适的数据结构(内置于Python、现有库或更通用的数据结构?

scipy有一系列

有七种可用的稀疏矩阵类型:
csc_矩阵:压缩稀疏列格式
csr_矩阵:压缩稀疏行格式
bsr_矩阵:块稀疏行格式
lil_矩阵:列表格式列表
dok_矩阵:密钥字典格式
coo_矩阵:坐标格式(又名IJV,三元组格式)
直径矩阵:对角线格式


由点(即2元组)键控的字典对我来说很好。它像一个数组,而且非常紧凑。只要你不需要进行范围查询或类似的操作,就应该可以了

# increment
p = (x, y)
counts[p] = counts.get(p, 0) + 1

# list
for (p, count) in counts.iteritems():
    x, y = p
    print x, y, count

这应该类似于处理数据范围大小的稀疏矩阵,这里有很多东西需要考虑

Erm-自我说明,在发布之前阅读所有已经打开的选项卡,所以…仅此而已;)为什么不使用
counts=defaultdict(int)
这样你就可以只写
counts[x,y]+=1
是的,
defaultdict
很酷,尽管它是在Python2.5中添加的,所以使用
d.get(p,0)+1
方法对于Python2.4和更早版本是可移植的,如果有人担心的话。@gnibler:因为我的Python非常生锈,我已经忘记了!为gnibbler干杯,我的+1非常有用,但我将另一个标记为答案,因为它有助于在查看优化LIB之前理解这个概念。