Python - 像素和相关值的有效表示

时间:2011-02-05 19:04:32

标签: python data-structures matrix numpy sparse-matrix

我正在使用python来处理大型(大约2000 x 2000)矩阵,其中矩阵中的每个IJ点代表一个像素。

矩阵本身是稀疏的(即它们中的很大一部分将具有零值),但是当它们被更新时,它们往往是增量操作,对于矩形“块”中的大量相邻像素,而不是随机的这里或那里的像素(我目前没有使用的属性......)。 对矩阵算法有点新意,但我已经研究了许多可能的解决方案,包括scipy稀疏矩阵的各种风格。到目前为止,协调(COO)矩阵似乎是最有希望的。 因此,例如,我想增加一个块形状,我必须做一些事情:

>>> from scipy import sparse
>>> from numpy import array
>>> I = array([0,0,0,0])
>>> J = array([0,1,2,3])
>>> V = array([1,1,1,1])
>>> incr_matrix = sparse.coo_matrix((V,(I,J)),shape=(100,100))
>>> main_matrix += incr_matrix  #where main_matrix was previously defined

将来,我想在任何情况下都有更丰富的像素值表示(代表RGB等的元组),numpy数组不支持开箱即用(或者我需要使用this )。

最终我会有一些这些矩阵,我需要做简单的算术,并且我需要代码尽可能高效 - 并且可以分发,所以我需要能够在没有实质性惩罚的情况下,坚持并以小规模的方式交换这些物体。我想知道这是否是正确的方法,或者我应该使用dicts等来查看我自己的结构?

3 个答案:

答案 0 :(得分:4)

一般规则是,首先使代码工作,然后根据需要进行优化......

在这种情况下,使用普通numpy 2000x2000阵列,或使用2000x2000x3 RGB。这将更容易和更快地使用,只需要很小的内存,并具有许多其他优点,例如,您可以使用标准的图像处理工具等。

然后,如果需要,“保持并交换这些对象”,您可以使用gzip,pytables,jpeg等来压缩它们,但不需要限制基于数据操作的存储要求。

通过这种方式,您可以同时获得更快的处理更好的压缩

答案 1 :(得分:2)

我会说,是的,这是要走的路。绝对是用字典构建的东西!构建“vector”数组时,使用结构化数组,即定义自己的dtype:

rgbtype = [('r','uint8'),('g','uint8'),('b','uint8')]

增加块时,它看起来像这样:

main_matrix['r'][blk_slice] += incr_matrix['r']
main_matrix['g'][blk_slice] += incr_matrix['g']
main_matrix['b'][blk_slice] += incr_matrix['b']

<强>更新

看起来你不能用coo_matrix进行矩阵运算,它们只是作为填充稀疏矩阵的便捷方式而存在。在进行更新之前,您必须将它们转换为另一种(稀疏)矩阵类型。的 documentation

答案 2 :(得分:0)

您可能需要考虑查看quadtree作为实现。四叉树结构在存储稀疏数据方面非常有效,并且具有额外的优点,即如果您使用由大量相似数据块组成的结构,则表示可以非常紧凑。我不确定这是否特别适用于您正在做的事情,因为我不知道“在块中工作”是什么意思,但它肯定值得检查作为替代稀疏矩阵实现。