【问题标题】:Why can I make a numpy array that's (apparently) bigger than my computer's memory?为什么我可以制作一个(显然)比我的计算机内存大的 numpy 数组?
【发布时间】:2017-02-27 04:44:14
【问题描述】:

当我在下面运行代码时:

import scipy.sparse
x = scipy.sparse.random(100000, 100000, 1e-4)
y = x.toarray()
print(y.nbytes)

我得到 80000000000 字节 = 80 GB 的输出。然而我使用的是只有 4 GB RAM 的 Macbook Air。有人可以解释一下我是如何(显然)创建一个大于我的内存大小的 NumPy 数组吗? y 在某种程度上是 x 的视图,而不是副本?我在scipy.sparse 文档中没有找到任何关于此的内容。毫不奇怪,如果我执行y.copy() 之类的操作,我会使 Python 崩溃……我不能指望对大小为 10^10 的数组做某事。谢谢!

版本: Python 3.5.2 通过 Anaconda 4.1.1、SciPy 0.17.1、NumPy 1.11.1。

【问题讨论】:

  • 我尝试创建np.zeros 数组,nbytes 接近 40GB。但实际使用的内存不到1GB。

标签: python numpy memory scipy sparse-matrix


【解决方案1】:

这是因为 numpy 实际上并没有分配所有的空间。最有可能的稀疏数组和矩阵用triplets, linked nodes 或其他忽略其间所有空白空间的方式表示。字节数是根据矩阵/数组的指定维度计算的,而不是内存中的实际数据。

【讨论】:

  • 数组x 是一种稀疏矩阵类型,因此您上面所说的当然适用。但是为了获得y,我使用toarray() 将其从稀疏形式显式转换为密集形式。这就是我感到困惑的原因。
  • 您仍在使用 numpy 类型。 toarray() 不会将其转换为本地 python 列表,因此您可以访问 .nbytes 。在它被转换为原生 python 列表之前,它可能会使用尽可能稀疏的表示来节省空间。
猜你喜欢
  • 2016-01-21
  • 2018-04-25
  • 2014-12-26
  • 2023-04-09
  • 1970-01-01
  • 2013-11-28
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多