Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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列表需要这么多内存?_Python_Numpy_Memory_One Hot Encoding - Fatal编程技术网

为什么这个python列表需要这么多内存?

为什么这个python列表需要这么多内存?,python,numpy,memory,one-hot-encoding,Python,Numpy,Memory,One Hot Encoding,我想用python创建一个numpy数组列表。数组大多为零,很少有标志设置为1 在运行以下代码时,我遇到了内存问题。这段代码需要的内存是我预期的两倍 填充列表的Python循环: vectorized_data = [] os.system("free -m") for dat in data: #data has length 200000 one_hot_vector = np.zeros(6000) for d in dat: one_hot_vector[

我想用python创建一个numpy数组列表。数组大多为零,很少有标志设置为1

在运行以下代码时,我遇到了内存问题。这段代码需要的内存是我预期的两倍

填充列表的Python循环:

vectorized_data = []
os.system("free -m")
for dat in data: #data has length 200000
    one_hot_vector = np.zeros(6000)
    for d in dat:
        one_hot_vector[d] = 1
    vectorized_data.append(one_hot_vector)
os.system("free -m") ##memory usage goes up by ~7.5GB
我希望此代码使用的内存量(向量维度:6000,#样本:200000,numpy浮点字节:4):

实际使用的内存量:

~7.5 GB

有没有更节省内存的方法来实现这一点

可以使用生成器和行/列id,例如:

def yield_row(data):
  for r_id, dat in enumerate(data):
      tmp = np.zeros(6000)
      for d in dat:
          tmp[d] = 1
      yield r_id, tmp

for r_id, tmp in yield_row(data):
  if is_hot_vector(tmp):
    do_stuff()
这种方法的缺点是只能访问行/列ID和当前tmp行,但是它减少了
数据
加一行所需的内存量


另一种方法可能是只将行id而不是整行添加到列表中,只对行进行索引,如果需要,还可以添加翻译/转换。

如果我理解正确,
数据和
矢量化的_数据都保存在内存中。@jmunch这是正确的。
np.zeros(6000)。dtype==dtype('float64')
np.dtype(np.float64).itemsize==8
(至少在我的电脑上是这样)-这可以解释你乘以错误数字的大小差异,它们是8个字节,而不是4个字节。也许您需要
np.zero(6000,np.float32)
(或
np.int32
)。数组必须存储其所有值,而不仅仅是您更改的值。我不知道文档中的引用与此有什么关系。
data
是列表还是数组?如果数组
数据[:20000]
未进行复制。
def yield_row(data):
  for r_id, dat in enumerate(data):
      tmp = np.zeros(6000)
      for d in dat:
          tmp[d] = 1
      yield r_id, tmp

for r_id, tmp in yield_row(data):
  if is_hot_vector(tmp):
    do_stuff()