【问题标题】:Python data structure for sparse list of x/y co-ordinates用于 x/y 坐标的稀疏列表的 Python 数据结构
【发布时间】:2011-05-17 21:01:22
【问题描述】:

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

但是数据将非常稀疏,最多有几千个条目,并且大多数坐标的条目为零。

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

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

字典的字典可能会在查找/迭代速度和内存使用之间取得很好的平衡。

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

【问题讨论】:

标签: python data-structures


【解决方案1】:

按点键控的字典(即 2 元组)对我来说听起来不错。它像数组一样 O(1),而且更紧凑。只要您永远不需要进行范围查询等,应该没问题。

# 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

【讨论】:

  • 为什么不用counts = defaultdict(int) 这样你就可以写counts[x,y]+=1
  • 是的,defaultdict 很酷,虽然它是在 Python 2.5 中添加的,所以如果有人担心的话,使用d.get(p, 0) + 1 方法对于 Python 2.4 及更早版本是可移植的。
  • @gnibbler:因为我的 Python 非常生锈,我已经忘记了!
【解决方案2】:

scipy 的范围为different sparse arrays

有七种可用的稀疏矩阵类型:
csc_matrix:压缩稀疏列格式
csr_matrix:压缩稀疏行格式
bsr_matrix:块稀疏行格式
lil_matrix:列表格式列表
dok_matrix:键格式字典
coo_matrix:COOrdinate 格式(又名 IJV,三元组格式)
dia_matrix: 对角线格式

【讨论】:

  • 干杯 gnibbler,我的 +1 非常有用,但我将另一个标记为答案,因为它有助于在查看优化的库之前理解这个概念。
【解决方案3】:

这应该类似于处理数据范围大小的稀疏矩阵,这里有很多东西需要细细琢磨http://en.wikipedia.org/wiki/Sparse_matrix

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2018-08-13
    • 2014-02-26
    相关资源
    最近更新 更多