在python中如何为numpy数组分配内存?

在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

我试图理解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]: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
这些元素的记忆是

  • 不连续
  • 更改而不重新分配
  • 此外,形状(1,3)数组中的元素一开始似乎是连续的内存,但对于其他形状,如

    [186]中的
    :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]