python中的稀疏3D矩阵,仅用于插入/删除元素、删除行和快速访问非空z维

python中的稀疏3D矩阵,仅用于插入/删除元素、删除行和快速访问非空z维,python,sparse-matrix,Python,Sparse Matrix,我正在寻找一种类似矩阵的数据类型,它将三元组(x,y,z)作为键,并可以实现: -初始值 -快速插入/删除 -删除行 -给定x,y获取所有z索引,使x,y,z为非默认值 这用于NFA解析器,其中x和z是状态,y是终端。python 3.4实现: class Sparse3DMatrix(): def __init__(self, default_value=False, max_x=100, max_y=100): self._dim = 3 self._max_x = ma

我正在寻找一种类似矩阵的数据类型,它将三元组(x,y,z)作为键,并可以实现: -初始值 -快速插入/删除 -删除行 -给定x,y获取所有z索引,使x,y,z为非默认值


这用于NFA解析器,其中x和z是状态,y是终端。

python 3.4实现:

class Sparse3DMatrix():
  def __init__(self, default_value=False, max_x=100, max_y=100):
    self._dim = 3
    self._max_x = max_x
    self._max_y = max_y
    self._init_non_empty_z()
    self._default_value = default_value
    self._elements = {}
  def __getitem__(self, triplet):
    assert(len(triplet) == self._dim)
    return self._elements.get(triplet, self._default_value)
  def __setitem__(self, triplet, value):
    assert(len(triplet) == self._dim)
    if value == self._default_value:
      if triplet in self._elements:
        self._delete_element(triplet)
    else:
      if triplet not in self._elements:
        self._add_element(triplet, value)
      else:
        self._elements[triplet] = value
  def _init_non_empty_z(self):
    self.non_empty_z = {}
    for i in range(self._max_x):
      for j in range(self._max_y):
        self.non_empty_z[i, j] = []
  def _delete_element(self, triplet):
    """ Deletes an element. Element is assumed to exist. """
    del self._elements[triplet]
    self.non_empty_z[triplet[0], triplet[1]].remove(triplet[2])
  def _add_element(self, triplet, value):
    """ Adds an element. triplet is assumed to be default value before call. """
    self._elements[triplet] = value
    self.non_empty_z[triplet[0], triplet[1]].append(triplet[2])
  def delete_by_axis(self, index, axis):
    """ Slow deletion of entire row / column / depth """
    old_triplets = self._elements.copy().items()
    self._elements = {}
    self._init_non_empty_z()
    for triplet, value in old_triplets:
      if triplet[axis] < index:
        self._add_element(triplet, value)
      elif triplet[axis] > index:
        new_triplet = list(triplet)
        new_triplet[axis] -= 1
        self._add_element(tuple(new_triplet), value)
  def all_non_default_value(self):
    return list(self._elements.keys())
类Sparse3DMatrix():
def_uuuinit_uuuu(self,默认值=False,max_x=100,max_y=100):
自身尺寸=3
self.\u max\u x=max\u x
self.\u max\u y=max\u y
self._init_non_empty_z()
self.\u default\u value=默认值
self._元素={}
def uu getitem uu(自身,三元组):
断言(len(三元组)=self.\u dim)
返回self.\u elements.get(三元组,self.\u默认值)
定义设置项(自身、三元组、值):
断言(len(三元组)=self.\u dim)
如果值==self.\u默认值\u:
如果在self.\u元素中为三元组:
自删除元素(三元组)
其他:
如果三元组不在self.\u元素中:
自我添加元素(三元组,值)
其他:
自身元素[三元组]=值
定义初始非空(自):
self.non_empty_z={}
对于范围内的i(自最大值):
对于范围内的j(自最大值):
self.non_empty_z[i,j]=[]
定义删除元素(自身,三元组):
“”“删除元素。元素假定存在。”“”
del self.\u元素[三元组]
self.non_empty_z[triplet[0],triplet[1]]。移除(triplet[2])
定义添加元素(自身、三元组、值):
“”“添加元素。在调用之前,假定三元组为默认值。”“”
自身元素[三元组]=值
self.non_empty_z[triplet[0],triplet[1]]。append(triplet[2])
def按_轴删除_(自身、索引、轴):
“”“缓慢删除整个行/列/深度”“”
旧的三元组=self.\u elements.copy().items()
self._元素={}
self._init_non_empty_z()
对于三元组,旧三元组中的值:
如果三元组[轴]<索引:
自我添加元素(三元组,值)
elif三重态[轴]>索引:
新三元组=列表(三元组)
新的三重态[轴]-=1
self.\u添加元素(元组(新的三元组),值)
定义所有非默认值(自身):
返回列表(self.\u elements.keys())