You'll find that using Python Longs unsuitable if you *change* the bitmaps---All numeric types are immutable, so you'll copy the bitmap each time you perform an operation like "set bit".
numarray has a 'bit' typecode, though I'm not sure how such an array is actually stored---from a quick look, it appears it's stored one bit per byte: >>> numarray.ones((3,3), 'Bool').tostring() '\x01\x01\x01\x01\x01\x01\x01\x01\x01' A Python object layer around array.array('B') would not necessarily be fast, but it would at least avoid the copying problem, and be memory efficient. import array class BitArray2D: def __init__(self, rows, cols): self.rows = rows self.cols = cols nbytes = (rows * cols + 7) / 8 self._data = array.array('B', [0]) * nbytes def __getitem__(self, (r,c)): # TODO: check r, c in bounds idx = r + c * self.rows byte = idx / 8 bit = 1 << (idx%8) return bool(self._data[byte] & bit) def __setitem__(self, (r, c), v): # TODO: check r, c in bounds idx = r + c * self.rows byte = idx / 8 bit = 1 << (idx%8) if v: self._data[byte] |= bit else: self._data[byte] &= ~bit b = BitArray2D(10, 10) print b._data for x in range(10): b[x,x] = b[9-x,x] = 1 print b._data print for x in range(10): for y in range(10): print " *"[b[x,y]], print Jeff
pgpswUV2pQdjG.pgp
Description: PGP signature
-- http://mail.python.org/mailman/listinfo/python-list