如何在Python中处理非常大但高度对称的数组?
我正在尝试创建一个包含大约1万亿个数据项的NumPy数组,并且希望以后能取出这些数据。这个数组有大约50个维度,每个维度有大约7个索引,也就是说,它是一个在50个维度上的7阶张量,形状是(50,50,50,50,50,50,50)。不过,这些数据是完全对称的,这意味着大部分数组的数据是重复的。具体来说,任何一个索引重复时,那个元素的值就是0,而通过任何索引的排列组合相关的元素总是相等。这意味着实际上只有大约100万个独特的非零元素。
问题是,我的电脑内存不够,连一个足够大的空数组都无法初始化。我当然可以处理一个只有1亿个数据项的数组,但我不知道该怎么做。
我有很强的数学背景,但编程经验不多。我知道应该有办法利用硬盘内存来补充RAM,但我也不确定我是否有足够的硬盘空间来存储这些数据。我相信可能有某种数学技巧可以将这个大的对称矩阵与一个较小的非对称矩阵联系起来,但我在网上找不到相关的信息。我还猜测可以使用稀疏矩阵的数据结构来绕过内存限制,这样程序就知道我不需要提前准备整个数组,但我对这方面的理解不深,找到的稀疏矩阵应用似乎也不适合我的情况。
我怀疑我的经验不足导致我在搜索时使用了错误的术语,并且误解了找到的解决方案。
那么,在Python中管理这种数据的最佳方法是什么呢?
1 个回答
1
利用这个问题中的对称性。
定义一个函数
def hash(dims, indices):
这个函数总是返回一个小于1亿的非负整数。
在访问你的numpy数组时,记得通过哈希函数来访问,这样我们就能存储少于1亿个不同的条目。
在这种情况下,底层的numpy存储是稀疏的还是密集的,可能都没什么大不了。
通常我们希望减少哈希函数产生的碰撞次数,但在这里,我们利用了一个特点:相似(对称)的坐标会哈希成相同的值。