2014-12-14 6 views
4

У меня есть список, который содержит данные о цвете 1024*1024, что означает 4,194,304 целые числа в этом списке. Мне нужно разбить его на 1024 под-списки, каждый из которых имеет 1024 под-списки, содержащие 4 канала, чтобы иметь возможность использовать его для чего мне нужно.Каков наиболее эффективный способ подразделить большой список?

Я попытался использовать для циклов для добавления данных в новые списки, но это очень медленный процесс. Мне просто нужен список, который нужно разделить каждые 4 целых числа. Каков наиболее эффективный способ сделать это? У меня есть numpy, если это можно как-то использовать.

Я полагаю, что список следует искать в распаковке struct из изображения .raw, поэтому, если есть способ разбить список на создание при распаковке, это также сработает.

+0

Как вы загружаете изображение? и распаковать его? – hpaulj

+0

@hpaulj Я использую struct.unpack ('=' + len (bytes) + 'B', bytes) –

+0

Значит, это большой кортеж байтов? – hpaulj

ответ

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-элементном 1-м массиве, вы могли бы сделать y = x.reshape(5,5,4), так что y[0][0] дает четыре канала (0,0) пикселя, y[0][1] содержит четыре канала (0,1) пикселя и скоро.

+0

Вам известно, насколько эффективно это происходит в чрезвычайно больших списках? –

+4

@CameronAtkinson Если ваши данные являются массивом numpy, это мгновенно, потому что не нужно копировать. Это просто дает вам другое представление о ваших данных. – jme

+0

Прохладный, я попробую. Благодарю. –

Смежные вопросы