Я работаю с большой матрицей (250x250x30 = 1 875 000 ячеек), и мне нужен способ установить произвольное количество флагов для каждой ячейки в этой матрице, в некотором роде, который прост в использовании и достаточно компактен .
Мой первоначальный план представлял собой массив списков размером 250x250x30, где каждый элемент был чем-то вроде: ["FLAG1","FLAG8","FLAG12"]
. Затем я изменил его на хранение только целых чисел: [1,8,12]
. Эти целые числа внутренне отображаются функциями получения / установки в исходные строки флагов. При этом используется только 250 МБ с 8 флагами на точку, что хорошо с точки зрения памяти.
У меня вопрос: я упускаю другой очевидный способ структурировать данные такого рода?
Спасибо всем за ваши предложения. Я закончил тем, что свел несколько предложений в одно, к сожалению, я могу выбрать только один ответ и вынужден согласиться с другими:
РЕДАКТИРОВАТЬ: эээ исходный код, который я имел здесь (используя наборы в качестве базового элемента трехмерного массива), использовал много памяти. Эта новая версия использует около 500 МБ при заполнении randint(0,2**1000)
.
import numpy
FLAG1=2**0
FLAG2=2**1
FLAG3=2**2
FLAG4=2**3
(x,y,z) = (250,250,30)
array = numpy.zeros((x,y,z), dtype=object)
def setFlag(location,flag):
array[location] |= flag
def unsetFlag(location,flag):
array[location] &= ~flag