如何高效地将大型列表进行分割?

4
我有一个包含1024x1024图像的RGBA颜色数据的列表,即该列表中包含4194304个整数。我需要将其分成1024个子列表,每个子列表都包含1024个子列表,按顺序包含4个通道,以便我可以使用它所需的方式。
我尝试使用for循环将数据附加到新列表中,但这是一个非常缓慢的过程。我只需要将列表每4个整数划分一次。有没有更有效的方法?如果可以的话,我有numpy库。
我想提一下,列表来自于解压.raw图像的struct,因此如果有一种在创建时就将列表拆分的方法,那也可以。

你如何加载图片并解压它? - hpaulj
@hpaulj 我使用 struct.unpack('='+len(bytes)+'B', bytes)。 - Cameron Atkinson
那么它是一个大的字节元组? - hpaulj
@hpaulj 实际上,所有这些都在一个list()中。现在它在一个np.array()中。 - Cameron Atkinson
https://dev59.com/OGgt5IYBdhLWcg3w3xIw 讨论了如何将二进制字符串或文件直接加载到数组中(无需使用“struct”解包)。使用dtype ='u1',数组应该包含1字节的整数而不是正常的4字节整数。 - hpaulj
1个回答

8
似乎您可以使用numpy.reshape来达到您想要的效果。假设您有一个包含12个元素的列表:
>>> import numpy as np
>>> x = np.arange(12)
>>> x
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

我们将重新调整它,使每行有四个元素:
>>> x.reshape(-1,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

你可以给reshape传递超过两个维度,比如说如果x是一个5x5的RGBA图像,存储在一个包含100个元素的一维数组中,你可以使用y = x.reshape(5,5,4)来进行操作。这样,y[0][0]将会返回(0,0)位置上的四个通道值,y[0][1]将会返回(0,1)位置上的四个通道值,以此类推。

你知道在处理非常大的列表时,这个程序的效率如何吗? - Cameron Atkinson
4
如果你的数据是一个NumPy数组,那么它几乎瞬间完成,因为不需要复制任何内容。它只是给你对数据的另一种视角。 - jme
好的,我会试一下。谢谢。 - Cameron Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接