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

2024-04-27 05:17:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我是个新手,我正在尝试在Numpy或常规Python数组中的特定索引处获取元素的地址。我正在听Coursera上的一节课,讲师会得到地址,但我很困惑,我是否能用Python做同样的事情,因为这门课是用另一种语言教的。下面是我试图用代码完成的一个数学示例:http://www.guideforschool.com/625348-memory-address-calculation-in-an-array/

这是我想做的。假设我有一个包含索引的数组:

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

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

^{pr2}$

我需要第一项,数组地址或基地址。我试过了:

import numpy as np

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

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

我肯定我永远不用做这些计算,但我想深入了解我所学到的一切。或者我会用它吗?什么时候我会用这个例子?在


Tags: numpy语言元素地址np数组事情array
1条回答
网友
1楼 · 发布于 2024-04-27 05:17:23

数组及其属性:

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}

切片的数据缓冲区位置:

^{pr2}$

切片共享数据缓冲区,但偏移量为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)}

相关问题 更多 >