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中找到。并且因为 d
和 e
指向相同内存地址的相同数据,所以数据地址将是相同的。反之,d
和f
指向的不是同一个数据,所以它们的指针是不同的。
查看下面的代码片段
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中找到。并且因为 d
和 e
指向相同内存地址的相同数据,所以数据地址将是相同的。反之,d
和f
指向的不是同一个数据,所以它们的指针是不同的。