numpy元素的内存地址

memory address of numpy elements

查看下面的代码片段

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

很容易理解,因为b的地址和a[1]的地址是一样的。因此,如果我更改 a 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. 如果地址不同,为什么元素同时改变了? 谁能解释一下?谢谢

每次像访问 c[1] 一样通过索引访问 ndarray 的内部 ndarray 时,都会即时创建一个新的 ndarray 作为内存(缓冲区)视图。在这一行中 id(c[1]) == id(d)c[1]d 是两个单独的 ndarray 实例,它们的 data 字段指向相同的内存地址(在中称为 "data area"麻木的文档)。考虑以下因素:

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指向的不是同一个数据,所以它们的指针是不同的。