numpy个元素的内存地址

问题描述 投票:2回答:1

请参见下面的代码片段

a = [[1, 2], [3, 4], [5, 6]]
b = a[1]
id(a[1]) == id(b) # True

这很容易理解,因为b的地址和a[1]的地址是相同的。因此,如果我更改a += 1中的元素,b中的元素也将更改b == [4, 5]

但是,如果我更改为numpy数组,则情况有所不同

c = numpy.array(a)
d = c[1]
id(c[1]) == id(d) # False

但是,如果我更改c c +=1中的元素,d中的元素也会改变(d也会更改为array([4, 5])),我不明白两件事,1.为什么d的地址和地址c[1]的不同? 2.如果地址不同,为什么元素会同时更改?有人可以解释吗?谢谢

python numpy memory-address
1个回答
0
投票

每次像使用ndarray一样通过索引访问ndarray的内部c[1]时,都会动态创建一个新的ndarray作为内存(缓冲区)视图。在此行id(c[1]) == id(d)c[1]d是两个单独的ndarray实例,它们的data字段指向相同的内存地址(在numpy doc中称为“数据区域”)。考虑以下内容:

a = [[1, 2], [3, 4], [5, 6]]
c = np.array(a)
d = c[0]
e = c[0]
f = c[1]
print(id(d) == id(e)) # False
print(d.__array_interface__['data'][0] == e.__array_interface__['data'][0]) # True
print(d.__array_interface__['data'][0] == f.__array_interface__['data'][0]) # False

每个ndarray保存的数据的位置可以在array interface中找到。并且由于de指向同一存储器地址处的同一数据,因此该数据地址将相同。相反,df并不指向相同的数据,因此它们的指针是不同的。

© www.soinside.com 2019 - 2024. All rights reserved.