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

如何获取Python数组中元素的地址?,python,python-3.x,numpy,Python,Python 3.x,Numpy,我是一个新手,我正在尝试获取Numpy或常规Python数组中特定索引处元素的地址。我正在关注Coursera上的一节课,其中讲师获得了地址,但我不知道我是否可以用Python做同样的事情,因为这节课是用另一种语言授课的。下面是我试图用代码实现的数学示例: 这是我想做的。假设我有以下带有索引的数组: |_|_|_|_|_|_|_| 1 2 3 4 5 6 7 我想计算索引4的地址,因此计算如下: array_address + elem_size x (index - first_index

我是一个新手,我正在尝试获取Numpy或常规Python数组中特定索引处元素的地址。我正在关注Coursera上的一节课,其中讲师获得了地址,但我不知道我是否可以用Python做同样的事情,因为这节课是用另一种语言授课的。下面是我试图用代码实现的数学示例:

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

|_|_|_|_|_|_|_|
 1 2 3 4 5 6 7
我想计算索引4的地址,因此计算如下:

array_address + elem_size x (index - first_index)
我需要第一项,数组地址或基址。我试过这个:

import numpy as np

a = np.ndarray([1,2,3,4,5,6,7])
print(a.__array_interface__['data'])
但我每次运行它都会得到一个不同的值,它不是针对一个特定的索引


我相信我永远不必做这些计算,但我想深入了解我所学到的一切。或者我会用它?什么时候我会使用它的一些例子是什么?

数组及其属性:

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}
切片共享数据缓冲区,但偏移量为4个元素(4*8)

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


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

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

数组及其属性:

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}
切片共享数据缓冲区,但偏移量为4个元素(4*8)

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


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

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

请注意,在Python中数组索引以0开头。@101是的,谢谢。每次在Python中创建对象(即
a=…
)时,它在内存中可能(通常)有一个不同的地址。您可能只想创建一次
a
,然后根据
a
不变的内存地址进行其余的计算。地址的概念在python中不像在c中那样有用。没有指针(在ctypes或其他类型之外)。当你从低级/中级语言跳到高级语言时,这只是其中一个无法翻译的东西。除此之外,列表的元素(不能说是特定的wrt numpy)是不连续的。它只是一个独立分配元素的引用数组,所以你不能说第四个元素在基址+4,它可以在任何地方。如果你想用1到7的元素构造一个数组,
a=np.ndarray([1,2,3,4,5,6,7])
不是你怎么做的。您需要
np.array
。如果您想要一个由1到7的整数索引的数组,NumPy就不是这样工作的。所有NumPy数组都是0索引的。请注意,在Python中数组索引以0开头。@101是的,谢谢。每次在Python中创建对象(即
a=…
)时,它可能(通常)在内存中有不同的地址。您可能只想创建一次
a
,然后根据
a
不变的内存地址进行其余的计算。地址的概念在python中不像在c中那样有用。没有指针(在ctypes或其他类型之外)。当你从低级/中级语言跳到高级语言时,这只是其中一个无法翻译的东西。除此之外,列表的元素(不能说是特定的wrt numpy)是不连续的。它只是一个独立分配元素的引用数组,所以你不能说第四个元素在基址+4,它可以在任何地方。如果你想用1到7的元素构造一个数组,
a=np.ndarray([1,2,3,4,5,6,7])
不是你怎么做的。您需要
np.array
。如果您想要一个由1到7的整数索引的数组,NumPy就不是这样工作的。所有NumPy数组都是0索引的。值得注意的是:这是一个简单的情况,一维,没有跨步。对于更复杂的情况,您还需要考虑步幅长度,无论数据是行还是列主数据,首先是owndata还是视图,等等。值得注意的是:这是一个简单的情况,一维,没有步幅。对于更复杂的情况,您还需要考虑步幅长度,数据是行主还是列主,它是owndata还是视图,等等
In [37]: arr[4].__array_interface__
Out[37]: 
{'data': (38269024, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (),
 'version': 3,
 '__ref': array(5)}