根据您的需要,实际上有数百种方法可以做到这一点。 Wikipedia 上的 Sparse Matrix 条目是一个很好的开始,可以找到一种专门适用于您需求的方法。
作为一个非常简单的示例,您可以像这样使用Dictionary of Keys 类:
class SparseDOK(dict):
def __init__(self):
pass
def __setitem__(self,key,value):
if value in[0,0.0,False,None]:
dict.__setitem__(self,key,False)
dict.__delitem__(self,key)
else:
dict.__setitem__(self,key,True)
def __getitem__(self, key):
try:
return dict.__getitem__(self, key)
except KeyError:
return False
>>> dok=SparseDOK()
>>> dok[10,20]=55
>>> print dok
{(10, 20): True}
>>> print dok[10,20]
True
>>> print dok[55,300]
False
>>> dok[10,20]=False
>>> print dok[10,20]
False
任意“矩阵”中的每个条目都假定为 False,除非特别设置为 True。您需要添加错误检查,但这将非常紧凑和快速。
构造Key Dictionary的优点是数据结构的构造非常高效。您只需将原始数据浏览一次,即可轻松添加或删除数据。缺点是一旦构建了矩阵,它的交互处理就会减少。
由于字典键是元组,因此按行或列添加索引很简单。由于整个矩阵需要在构造之后进行处理才能执行此操作,因此我们可以构造一个包含任何所需总和或乘积的 dict,然后引用已处理数据的该 dict。
>>> dok[10,20]=True
>>> dok[10,2000]=True
>>> dok[11,2000]=True
>>> dok[35000,2000]=True
>>> dok[10,35000]=True
>>> print dok
{(11, 2000): True, (10, 2000): True, (35000, 2000): True, (10, 20): True, (10, 35000): True}
cols={}
for tup in dok.keys():
if tup[1] not in cols:
cols[tup[1]]=1
else:
cols[tup[1]]+=1
>>> print cols
{2000: 3, 35000: 1, 20: 1}
现在您可以参考 cols 中的 col 键来获取 col 行的总和。添加产品等很简单。请记住,如果原始 DOK 被编辑或更改,您需要重新计算总和/产品。如果您预计 DOK 在首次创建后会经常更改,则可以保留一个运行总计。
如果您的需求更复杂,请考虑使用SciPy 或Pysparse。如您所见,SciPy 中有 7 种不同的稀疏矩阵格式。不要重新发明别人已经做得更好的东西......