Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy阵列中有多少内存?RAM是一个限制因素吗?_Python_Arrays_Memory_Numpy - Fatal编程技术网

Python numpy阵列中有多少内存?RAM是一个限制因素吗?

Python numpy阵列中有多少内存?RAM是一个限制因素吗?,python,arrays,memory,numpy,Python,Arrays,Memory,Numpy,我正在使用numpy创建一个边长为100的立方体数组,因此总共包含100万个条目。对于一百万个条目中的每一个,我插入一个100x100矩阵,其条目由随机生成的数字组成。我正在使用以下代码执行此操作: import random from numpy import * cube = arange(1000000).reshape(100,100,100) for element in cube.flat: matrix = arange(10000).reshape(100,100)

我正在使用numpy创建一个边长为100的立方体数组,因此总共包含100万个条目。对于一百万个条目中的每一个,我插入一个100x100矩阵,其条目由随机生成的数字组成。我正在使用以下代码执行此操作:

import random
from numpy import *

cube = arange(1000000).reshape(100,100,100)

for element in cube.flat:
    matrix = arange(10000).reshape(100,100)
    for entry in matrix.flat:
        entry = random.random()*100
    element = matrix
我原以为这需要一段时间,但由于生成了100亿个随机数,我甚至不确定我的计算机是否能处理它。这样的阵列会占用多少内存?RAM是否会成为一个限制因素,即如果我的计算机没有足够的RAM,它是否会无法实际生成阵列

另外,如果有更有效的方法来实现此代码,我将非常感谢提示:)

几点:

  • numpy阵列的内存大小易于计算。它只是元素数乘以数据大小,再加上一小部分固定开销。例如,如果您的
    cube.dtype
    int64
    ,并且它有1000000个元素,则需要
    1000000*64/8=8000000
    字节(8Mb)
  • 然而,正如@Gabe所指出的,100*100*1000000双打将需要大约20分钟
  • 这本身不会导致任何“中断”,但操作速度会慢得离谱,因为您的计算机需要执行所有操作
  • 您的循环不会达到预期效果。
    element=matrix
    将简单地覆盖
    元素
    变量,而不是替换
    多维数据集中的元素
    ,使
    多维数据集保持不变。这同样适用于
    条目=random.rand()*100
  • 相反,请参见:
有关函数的“内部”部分,请查看numpy.random模块

import numpy as np
matrix = np.random.random((100,100))*100

假设
double
精度为8字节,如果您真的要存储100亿字节,则为80GB。如果你不得不问,你的电脑没有足够的内存。这就是说,看起来你正在创建它们,但没有存储它们,所以你应该没事。如果你超过了可用虚拟内存的总量,事情确实会“崩溃”,在这种情况下,这似乎很有可能,因为没有多少人的交换空间大于80GB。在处理
np.zeros()之类的函数时,情况并不完全如此
。使用延迟加载(至少在Linux版本中是这样),这将避免在访问某些元素之前使用大量内存。例如,您可以使用
np.zero((2400024000))
创建一个矩阵,它不会占用太多内存,但如果使用
np.random.random((2400024000))
,它会占用超过4GB的内存。更好的解释: