在python中如何为numpy数组分配内存?
我试图理解numpy“2D”数组造成的差异,即numpy.zeros((3,)、numpy.zeros((3,1))、numpy.zeros((1,3)) 我使用在python中如何为numpy数组分配内存?,python,numpy,memory,mpi4py,Python,Numpy,Memory,Mpi4py,我试图理解numpy“2D”数组造成的差异,即numpy.zeros((3,)、numpy.zeros((3,1))、numpy.zeros((1,3)) 我使用id查看每个元素的内存分配。但我在iPython控制台中发现了一些奇怪的输出 a=np.zero((1,3)) In[174]:id(a[0,0]) Out[174]:4491074656 In[175]:id(a[0,1]) Out[175]:4491074680 [176]中的id(a[0,2]) Out[176]:44910747
id
查看每个元素的内存分配。但我在iPython控制台中发现了一些奇怪的输出
a=np.zero((1,3))
In[174]:id(a[0,0])
Out[174]:4491074656
In[175]:id(a[0,1])
Out[175]:4491074680
[176]中的id(a[0,2])
Out[176]:4491074704
在[177]中:id(a[0,0])
Out[177]:4491074728
In[178]:id(a[0,1])
Out[178]:4491074800
在[179]中:id(a)
Out[179]:4492226688
In[180]:id(a[0,1])
Out[180]:4491074752
这些元素的记忆是
:a=np.zero((3,))
In[187]:id(a)
Out[187]:4490927280
In[188]:id(a[0])
Out[188]:4491075040
In[189]:id(a[1])
Out[189]:4491074968
[191]中的:a=np.random.rand(4,1)
In[192]:id(a)
Out[192]:4491777648
In[193]:id(a[0])
Out[193]:4491413504
在[194]中:id(a[1])
Out[194]:4479900048
在[195]:id(a[2])
Out[195]:4491648416
实际上,我不太确定id
是否适合在Python中检查内存。据我所知,在Python中获取变量的物理地址没有简单的方法
就像C或Java一样,我希望这种“2D”数组中的元素在内存中应该是连续的,这似乎不是真的。另外,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)
根据和,numpy不存储数组值(?),因此当您使用
id()
时,它会动态创建数组,这就是为什么“元素的内存在不重新分配的情况下发生变化”(?)id
不会告诉您这一点。这3个数组使用相同的底层数据缓冲区结构。基本numpy文档描述了ndarray
结构,mpi4py
谈到了使用Python缓冲协议(以及pickle
用于其他类型的对象)numpy
使用此选项。这是一个示例介绍。可能有新的更完整的描述。a.。\uuuu数组\u接口\uuu['data'][0]
是数组a
的数据缓冲区开始的整数表示。a
的视图将在附近显示值。e、 g.a[1:2]
,而不是a[1]
。