当前位置: 首页 > 知识库问答 >
问题:

Numpy数组的Python内存使用

鲁华灿
2023-03-14

我正在使用python来分析一些大文件,我遇到了内存问题,所以我一直在使用sys.getsizeof()来尝试跟踪使用情况,但是它在Numpy数组中的行为很奇怪。这里有一个例子,涉及到我必须打开的反照率地图:

>>> import numpy as np
>>> import struct
>>> from sys import getsizeof
>>> f = open('Albedo_map.assoc', 'rb')
>>> getsizeof(f)
144
>>> albedo = struct.unpack('%df' % (7200*3600), f.read(7200*3600*4))
>>> getsizeof(albedo)
207360056
>>> albedo = np.array(albedo).reshape(3600,7200)
>>> getsizeof(albedo)
80

数据仍然存在,但是对象的大小,一个3600x7200像素的映射,已经从200 Mb变为80字节。我希望我的内存问题结束,把所有的东西都转换成numpy数组,但我觉得这种行为,如果是真的,会在某种程度上违反信息理论或热力学定律,或者其他什么,所以我倾向于相信getsizeof()不适用于numpy数组。有什么想法吗?

共有3个答案

乔凯康
2023-03-14

python笔记本中,我经常想过滤掉“悬挂”的numpy.ndarray,特别是那些存储在_1_2等中的,这些东西从来都不是真正的活着的。

我使用这个代码来获得所有它们的列表和它们的大小。

不确定这里是locals()还是globals()更好。

import sys
import numpy
from humanize import naturalsize

for size, name in sorted(
    (value.nbytes, name)
    for name, value in locals().items()
    if isinstance(value, numpy.ndarray)):
  print("{:>30}: {:>8}".format(name, naturalsize(size)))
巫研
2023-03-14

nbytes字段将给出numpy.array中数组所有元素的字节大小:

size_in_bytes = my_numpy_array.nbytes

请注意,这并不度量“数组对象的非元素属性”,因此以字节为单位的实际大小可以比这个大几个字节。

盖马鲁
2023-03-14

您可以使用数组。n字节用于numpy阵列,例如:

>>> import numpy as np
>>> from sys import getsizeof
>>> a = [0] * 1024
>>> b = np.array(a)
>>> getsizeof(a)
8264
>>> b.nbytes
8192
 类似资料:
  • 问题内容: 我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它: 所需结果: 实际结果: 可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。 问题答案: 永远不要在循环中追加数组:与基本的Python相比,这是NumPy非常不擅长的一项操作。这是因为您要对每个数据进行完整复制,这将花费您二次时间。 相反,只需将您的数组附加到Python列表中,并在最后进行转

  • 问题内容: 我想在共享内存中使用一个numpy数组,以便与多处理模块一起使用。困难是像numpy数组一样使用它,而不仅仅是ctypes数组。 这将产生如下输出: 可以ctypes方式访问该数组,例如arr[i]说得通。但是,它不是一个numpy数组,因此我无法执行,或。我想一个解决方案是将数组转换为数组。但是(除了无法完成这项工作外),我不相信会再共享它。 对于必须解决的常见问题,似乎将有一个标准

  • 问题内容: 我知道有关此主题的几个问题和答案,但尚未找到对此特定问题的满意答案: 什么是对python循环进行简单的共享内存并行化的最简单方法,在该循环中,通过numpy / scipy函数操作numpy数组? 我并不是在寻找最有效的方法,我只是想实现一些简单的实现,当循环不并行运行时,不需要大量重写。就像OpenMP以较低级别的语言实现一样。 我在这方面看到的最好的答案就是这个,但这是一种很笨拙

  • 问题内容: 我有一个Numpy数组类型的矩阵。如何将其作为映像写入磁盘?任何格式都可以使用(png,jpeg,bmp …)。一个重要的约束是不存在PIL。 问题答案: 你可以使用PyPNG。这是一个纯Python(无依赖性)开源PNG编码器/解码器,它支持将NumPy数组写为图像。

  • 问题内容: 请我有点Python陌生,感觉很好,我可以说python很性感,直到我需要移动4x4矩阵的内容,我想在构建游戏的2048游戏演示时使用它,在这里,我有这个功能 如果你这样调用它,这就是函数的作用 它将覆盖左侧的零并产生 请让我帮助某人,以numpy达到更快的速度并且需要更少的代码(我在深度优先搜索算法中使用的代码),更重要的是cover_up,cover_down和 问题答案: 这里有

  • 问题内容: 我对python和numpy很陌生。请问有人可以帮助我了解如何对用作索引的某些数组进行索引。我有以下六个2D阵列- 我想将这些数组用作索引,并将值10放入新的空矩阵的相应索引中。输出应如下所示: 到目前为止,我已经尝试过 但这给了我错误的输出。任何帮助请。 问题答案: 工作原理: 如果您在工作分配中使用 两个 numpy数组建立索引, 然后认为NumPy的作为过的各元件同时移动和中的每