我正在使用python来处理大型(大约2000 x 2000)矩阵,其中矩阵中的每个I
,J
点代表一个像素。
矩阵本身是稀疏的(即它们中的很大一部分将具有零值),但是当它们被更新时,它们往往是增量操作,对于矩形“块”中的大量相邻像素,而不是随机的这里或那里的像素(我目前没有使用的属性......)。
对矩阵算法有点新意,但我已经研究了许多可能的解决方案,包括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
等来查看我自己的结构?
答案 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作为实现。四叉树结构在存储稀疏数据方面非常有效,并且具有额外的优点,即如果您使用由大量相似数据块组成的结构,则表示可以非常紧凑。我不确定这是否特别适用于您正在做的事情,因为我不知道“在块中工作”是什么意思,但它肯定值得检查作为替代稀疏矩阵实现。