可以使用numpy创建100万 x 100万的矩阵吗?
可能是重复的问题:
Python Numpy 非常大的矩阵
我尝试用 numpy.zeros((100k x 100k)) 来创建一个矩阵,但它返回了“数组太大了”。
对评论的回应:
1) 我可以创建一个 10k x 10k 的矩阵,但不能创建 100k x 100k 和 1mil x 1mil 的矩阵。
2) 这个矩阵不是稀疏矩阵。
3 个回答
你的系统可能没有足够的内存来存储这个矩阵,但现在你可能有很多可用的硬盘空间,甚至是几个TB(太字节)。在这种情况下,numpy.memmap 可以让你把数组存储在硬盘上,但看起来就像是在内存中一样。
不过,最好还是重新考虑一下这个问题。你真的需要这么大的矩阵吗?涉及到这个矩阵的计算可能会非常慢,而且需要分块进行。
你的矩阵里有很多零吗?我猜可能有,因为很少有人会处理这么大的密集问题。
你可以用稀疏矩阵来轻松解决这个问题。SciPy里有一个很不错的稀疏矩阵库。你可以查看这个链接了解更多:http://docs.scipy.org/doc/scipy/reference/sparse.html。稀疏矩阵所需的空间是根据非零元素的数量来决定的,而不是根据矩阵的大小。
我们可以通过简单的数学计算来了解这个问题。一个一百万乘一百万的矩阵有1,000,000,000,000个元素。如果每个元素占用4个字节,那就需要4,000,000,000,000个字节的内存,也就是大约3.64太字节。
另外,Python的某些实现可能会为单个数字使用更多的内存。例如,从浮点数(float)转换为双精度浮点数(double)后,你可能需要7.28太字节的内存。(还有可能Python会把数字存储在堆内存中,你得到的只是一个指向它的指针,这样会大约使内存占用翻倍,甚至不算上其他的元数据——不过这方面我不太确定,关于Python的内部机制我总是说错话,所以我们就不深入讨论了。)
我想numpy
并没有硬性限制,但如果你的系统没有那么多可用内存,那就没办法了。