python - python中numpy数组的内存是如何分配的?
问题描述
我试图了解由 numpy “2D” 数组引起的差异,即 numpy.zeros((3, ))、numpy.zeros((3, 1))、numpy.zeros((1, 3))。
我曾经id
查看每个元素的内存分配。但我在 iPython 控制台中发现了一些奇怪的输出。
a = np.zeros((1, 3))
In [174]: id(a[0, 0])
Out[174]: 4491074656
In [175]: id(a[0, 1])
Out[175]: 4491074680
In [176]: id(a[0, 2])
Out[176]: 4491074704
In [177]: id(a[0, 0])
Out[177]: 4491074728
In [178]: id(a[0, 1])
Out[178]: 4491074800
In [179]: id(a)
Out[179]: 4492226688
In [180]: id(a[0, 1])
Out[180]: 4491074752
元素的记忆是
- 不连续
- 改变而不重新分配
此外,形状 (1, 3) 数组中的元素一开始似乎是连续记忆的,但对于其他形状甚至不是这样,比如
In [186]: a = np.zeros((3, ))
In [187]: id(a)
Out[187]: 4490927280
In [188]: id(a[0])
Out[188]: 4491075040
In [189]: id(a[1])
Out[189]: 4491074968
In [191]: a = np.random.rand(4, 1)
In [192]: id(a)
Out[192]: 4491777648
In [193]: id(a[0])
Out[193]: 4491413504
In [194]: id(a[1])
Out[194]: 4479900048
In [195]: id(a[2])
Out[195]: 4491648416
我实际上不太确定是否id
适合在 Python 中检查内存。据我所知,我想没有简单的方法可以在 Python 中获取变量的物理地址。
就像 C 或 Java 一样,我希望这种“二维”数组中的元素在内存中应该是连续的,这似乎不是真的。此外,结果id
不断变化,这真的让我感到困惑。
我对此很感兴趣,因为我有点使用 mpi4py,我想弄清楚 CPU 之间是如何发送/接收变量的。
解决方案
Numpy 数组将其数据保存在与对象本身分开的内存区域中。如下图所示:
要获取数据的地址,您需要创建数组视图并检查ctypes.data
第一个数据元素地址的属性:
import numpy as np
a = np.zeros((3, 2))
print(a.ctypes.data)
print(a[0:1, 0].ctypes.data)
print(a[0:1, 1].ctypes.data)
print(a[1:2, 0].ctypes.data)
print(a[1:2, 1].ctypes.data)
推荐阅读
- html - 为什么我的 h1 元素出现在 header-image 后面,尽管它是在 header 元素下面定义的?
- python - 您是否必须在 Mac 上安装 python 才能运行 Platypus 应用程序?
- spring - 在 Spring 路由定义中使用谓词不起作用
- c# - C# 无法下载 XML 作为附件
- php - 将搜索数据保存到文本文件是否安全?
- mysql - sql字符串在没有准备好的语句的情况下执行
- java - 从字符串中删除元音 - 我得到的答案与输入相同。你能告诉我为什么吗?
- python - 如何在 Python 3 中选择字符串的某些部分?
- java - 我不知道如何完成此代码以显示收藏夹列表
- opencv - 如何通过命令行(Ubuntu)编译 OpenCV 程序?