如何获取Python数组中元素的地址?

时间:2018-07-03 02:57:14

标签: python python-3.x numpy

我是新手,我正在尝试获取Numpy或常规Python数组中特定索引处的元素地址。我正在Coursera上的一门课上讲课,在该课上讲师会获得地址,但是由于我用另一种语言来授课,所以我是否能用Python做到这一点感到困惑。这是我要使用代码完成的数学示例:http://www.guideforschool.com/625348-memory-address-calculation-in-an-array/

这就是我想要做的。假设我有以下带有索引的数组:

|_|_|_|_|_|_|_|
 1 2 3 4 5 6 7

我想计算索引4的地址,因此计算如下:

array_address + elem_size x (index - first_index)

我需要第一项,即array_address或Base地址。我已经尝试过了:

import numpy as np

a = np.ndarray([1,2,3,4,5,6,7])
print(a.__array_interface__['data'])

但是我每次运行都会得到不同的值,并且不是针对一个特定的索引。

我确定我永远都不必进行这些计算,但我想深入了解我正在学习的所有内容。还是我会使用它?什么时候可以使用此示例?

1 个答案:

答案 0 :(得分:3)

一个数组及其属性:

In [28]: arr = np.arange(1,8)
In [29]: arr.__array_interface__
Out[29]: 
{'data': (41034176, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (7,),
 'version': 3}

切片的数据缓冲区位置:

In [30]: arr[4:].__array_interface__['data'][0]
Out[30]: 41034208
In [31]: arr[4:].__array_interface__['data'][0]-arr.__array_interface__['data'][0]
Out[31]: 32

分片共享数据缓冲区,但偏移量为4个元素(4 * 8)。

使用此信息,我可以使用ndarray构造函数(通常不需要)获取切片:

In [35]: np.ndarray((3,), dtype=int, buffer=arr.data, offset=32)
Out[35]: array([5, 6, 7])
In [36]: arr[4:7]
Out[36]: array([5, 6, 7])

arr.data是一个memoryview对象,它以某种方式引用了此数组的数据缓冲区。 arr.data的ID /地址与我上面使用的数据指针不同。

In [38]: arr.data
Out[38]: <memory at 0x7f996d950e88>
In [39]: type(arr.data)
Out[39]: memoryview

请注意,arr[4]的数据位置是完全不同的。它是“未装箱的”,不是切片:

In [37]: arr[4].__array_interface__
Out[37]: 
{'data': (38269024, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (),
 'version': 3,
 '__ref': array(5)}