numpy 已经被 EnricoGiampieri 推荐过,如果你可以使用它,你应该这样做。
否则,有两种选择:
按照 NPE 的建议,锯齿状数组将是 list 的 list 的 bitarrays。这允许你有锯齿状的边界——例如,每一行可以是不同的宽度,甚至可以独立调整大小:
bits3d = [[bitarray.bitarray(1000) for y in range(1000)] for x in range(1000)]
myvalue = bits3d[x][y][z]
或者,按照 Xymotech 的建议,对一维数组进行自己的索引:
bits3d = bitarray.bitarray(1000*1000*1000)
myvalue = bits3d[x + y*1000 + z*1000*1000]
无论哪种方式,您都可能希望将其封装在一个类中,这样您就可以这样做:
bits3d = BitArray(1000, 1000, 1000)
myvalue = bits3d[x, y, z]
这很简单:
class Jagged3DBitArray(object):
def __init__(self, xsize, ysize, zsize):
self.lll = [[bitarray(zsize) for y in range(ysize)]
for x in range(xsize)]
def __getitem__(self, key):
x, y, z = key
return self.lll[x][y][z]
def __setitem__(self, key, value):
x, y, z = key
self.lll[x][y][z] = value
class Fixed3DBitArray(object):
def __init__(self, xsize, ysize, zsize):
self.xsize, self.ysize, self.zsize = xsize, ysize, zsize
self.b = bitarray(xsize * ysize * zsize)
def __getitem__(self, key):
x, y, z = key
return self.b[x + y * self.ysize + z * self.ysize * self.zsize]
def __setitem__(self, key, value):
x, y, z = key
self.b[x + y * self.ysize + z * self.ysize * self.zsize] = value
当然,如果你想要更多的功能(比如切片),你必须多写一点。
锯齿状数组会使用更多内存(毕竟,您有 1M bitarray 对象和 1K list 对象的开销),并且可能会慢一些,但这通常不会有太大区别.
重要的决定因素应该是您的数据是否存在锯齿状行本质上的错误。如果是这样,请使用第二种解决方案;如果有锯齿状或可调整大小的行可能有用,请使用前者。 (请记住,如果可能的话,我会在任一解决方案上使用 numpy。)