Numpy数组更改id

2024-07-03 06:37:51 发布

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

这是怎么回事?似乎阵列的id位置没有保持稳定也许?即使ID相同,is操作员仍返回False。然后在打印数组之后,元素的id会发生变化。有什么解释吗?在

import numpy as np
a = np.arange(27)
b = a[1:5]
a[0] is b[1] #False
id(a[0]) #40038736L
id(b[1]) #40038736L
a #prints the array
id(b[1]) #40038712L
id(a[0]) #40038712L
b[0] #1
a[1] #1
id(b[0]) #40038712L
id(a[1]) #40038784L

Tags: theimportnumpyidfalse元素isas
1条回答
网友
1楼 · 发布于 2024-07-03 06:37:51

第一个测试列表:

In [1109]: a=[0,1,2,3,4]
In [1112]: b=a[1:3]

In [1113]: id(a[1])
Out[1113]: 139407616
In [1114]: id(b[0])
Out[1114]: 139407616

In [1115]: a[1] is b[0]
Out[1115]: True

后来我试过了

^{pr2}$

因此a[1]中的对象始终是整数1(整数的id有点棘手,并且依赖于实现)。在

但是使用数组:

In [1118]: aa=np.arange(5)
In [1119]: ba=aa[1:]

In [1121]: aa[1]
Out[1121]: 1
In [1122]: ba[0]
Out[1122]: 1
In [1123]: id(aa[1])
Out[1123]: 2925837264
In [1124]: id(ba[0])
Out[1124]: 2925836912

id完全不同;事实上,它们会随着每次访问而变化:

In [1125]: id(aa[1])
Out[1125]: 2925837136
In [1126]: id(ba[0])
Out[1126]: 2925835104

这是因为aa[1]不仅仅是一个整数1。它是一个np.int32对象。在

In [1127]: type(aa[1])
Out[1127]: numpy.int32

与列表不同,数组的值以字节的形式存储在databuffer中。b[1:]是一个view,访问同一个数据缓冲区。但是a[1]是一个新对象,它包含对该数据缓冲区的引用。与list case相反,a[1]不是a中的第二个对象。在

一般来说,id在处理数组时是没有用的,is测试也没有用。使用==或{}(用于浮动)。在

==============

查看aa值存储位置的方法是:

In [1137]: aa.__array_interface__
Out[1137]: 
{'data': (179274256, False),      # 'id' so to speak of the databuffer
 'descr': [('', '<i4')],
 'shape': (5,),
 'strides': None,
 'typestr': '<i4',
 'version': 3}
In [1138]: ba.__array_interface__
Out[1138]: 
{'data': (179274260, False),    # this is 4 bytes larger
 'descr': [('', '<i4')],
 'shape': (4,),
 'strides': None,
 'typestr': '<i4',
 'version': 3}

这两个数组的data指针是相关的,因为ba是一个view。在

aa[1]类似数组,也有数据缓冲区,但它不是视图。在

In [1139]: aa[1].__array_interface__
Out[1139]: 
{'__ref': array(1),
 'data': (182178952, False),
 ...}

相关问题 更多 >