我是新手,我正在尝试获取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'])
但是我每次运行都会得到不同的值,并且不是针对一个特定的索引。
我确定我永远都不必进行这些计算,但我想深入了解我正在学习的所有内容。还是我会使用它?什么时候可以使用此示例?
答案 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)}