numpy
EnricoGiampieriによってすでに提案されており、これを使用できる場合は、そうする必要があります。
それ以外の場合は、2つの選択肢があります。
NPEによって提案されているように、ジャグ配列はsのalist
になります。これにより、ギザギザの境界を設定できます。たとえば、各行の幅を変えたり、個別にサイズを変更したりできます。list
bitarray
bits3d = [[bitarray.bitarray(1000) for y in range(1000)] for x in range(1000)]
myvalue = bits3d[x][y][z]
または、Xymostechが提案しているように、1-D配列で独自のインデックスを作成します。
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
もちろん、より多くの機能(スライスなど)が必要な場合は、もう少し書く必要があります。
ジャグ配列はもう少し多くのメモリを使用し(結局のところ、1Mbitarray
オブジェクトと1Klist
オブジェクトのオーバーヘッドがあります)、少し遅くなる可能性がありますが、通常、これは大きな違いにはなりません。
重要な決定要因は、データにギザギザの行があることが本質的にエラーであるかどうかです。その場合は、2番目のソリューションを使用してください。ギザギザまたはサイズ変更可能な行があると便利な場合は、前者を使用してください。numpy
(可能であれば、どちらのソリューションでも使用することを念頭に置いてください。)