class MulitArray:
def __init__(self,*dimensions):
assert len(dimensions) > 1
self._dims = dimensions
size = 1
for d in dimensions:
assert d > 0,"Dimeons must be >0"
size*= d
self._elements = Array(size)
self._factors = Array(len(dimensions))
self._computeFactors()
def numDims(self):
return len(self._dims)
def length(self,dim):
assert dim >= 1 and dim < len(self._dims),\
"Dimension component out of range"
#从1开始
return self._dims[dim-1]
def clear(self,value):
self._elements.clear(value)
def __getitem__(self,ndxTuple):
assert len(ndxTuple) == self.numDims(),"Invalid # of array subscripts"
index = self._computeIndex(ndxTuple)
assert index is not None,"Array subscript out of range"
return self._elements[index]
def __setitem__(self,ndxTuple,value):
assert len(ndxTuple) == self.numDims(),"Invalid # of array subscripts"
index = self._computeIndex(ndxTuple)
assert index is not None,"Array subscript out of range"
self._elements[index] = value
def _computeIndex(self,idx):
offset = 0
for j in range(len(idx)):
#其实这里也没必要设置的只要最后结果好就行
if idx[j] < 0 or idx[j] >= self._dims[j]:
return None
else:
offset += idx[j] * self._factors[j]
return offset
def _computeFactors(self):
f = 1
for i in range(self.numDims()-1,-1,-1):
self._factors= f
f *= self._dims