numpy - 为什么numpy数组的大小不同?
问题描述
我有两个 numpy a,b
,它们的形状是(100,2048),我使用sys.getsizeof(a) = 112
和数组 b 相同。
我有疑问,当我使用 时c = np.concatenate((a,b),axis=0)
,c 的形状是 (200,2048),但是sys.getsizeof(c) = 1638512
为什么?
解决方案
getsizeof
价值有限。对于列表来说,这可能是一个问题。对于数组,它更好,但您必须了解数组是如何存储的。
In [447]: import sys
In [448]: a = np.arange(100)
In [449]: sys.getsizeof(a)
Out[449]: 896
但看看size
a view
:
In [450]: b = a.reshape(10,10)
In [451]: sys.getsizeof(b)
Out[451]: 112
这显示了数组对象的大小,但不显示共享数据缓冲区的大小。 b
没有自己的数据缓冲区。
In [453]: a.size
Out[453]: 100
In [454]: b.size
Out[454]: 100
所以我的猜测是你的a
和b
是其他一些数组的视图。但是连接会产生一个带有自己数据缓冲区的新数组。不可能是其他两个的看法。所以它getsizeof
反映了这一点。
In [457]: c = np.concatenate((a,b.ravel()))
In [459]: c.shape
Out[459]: (200,)
In [460]: c.size
Out[460]: 200
In [461]: sys.getsizeof(c)
Out[461]: 1696
数据缓冲区为a
100*8 字节,因此“开销”为 96。对于c
200*8,“开销”再次为 96。
推荐阅读
- docker - 如何将文件从一个 docker 容器复制到另一台主机上的另一个容器?
- c# - 在 ASP.NET Core MVC App 中添加动态表单字段
- facebook - 使用 MoPub 接收非英语 Facebook 原生广告
- python - SyntaxError:python 中的语法无效但找不到原因
- c++ - 为什么我调整大小的 2D 矢量会重置我的数据
- c# - Telerik RadFileExplorer 修改 SaveAs 方法
- angular - RxJS:forkJoin 没有返回
- visual-studio-code - 在 VS Code 扩展中获取当前的 Highlight
- javascript - 清除所选选项并在提交表单后显示占位符
- ruby-on-rails - 引用 Rails 模型而不加载模型的单元测试代码