np.数组配置项大小与sys.getsizeof系统(arr[0])

2024-09-20 23:01:26 发布

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

给定一个数组

arr = array([  9.93418544e+00,   1.17237323e+01,   1.34554537e+01,
         2.43598467e+01,   2.72818286e+01,   3.11868750e+01,...])

当执行以下命令时,我得到一些输出:

arr.itemsize # 8
type(arr[0]) # numpy.float64
sys.getsizeof(np.float64()) # 32
sys.getsizeof(arr[0]) # 32
arr.dtype # dtype('float64')

似乎itemsize不能正常工作。我很感兴趣为什么会这样?你知道吗

我和你一起工作

print(sys.version)
3.5.5 | packaged by conda-forge | (default, Jul 24 2018, 01:52:17) [MSC v.1900 64 bit (AMD64)]
numpy==1.10.4

Tags: 命令numpyversiontypenpsys数组array
1条回答
网友
1楼 · 发布于 2024-09-20 23:01:26

It seems that itemsize doesn't work properly.

确实如此,不同的结果是因为Python对象与numpy中的项不同。你知道吗

在Python中,一切都是一个对象。数据被“装箱”。这意味着,例如对于int,我们得到:

>>> sys.getsizeof(2)
28

这是28个字节。太多了。在大多数编程语言中,int需要2到8个字节。如果是32位int,则需要4个字节。你知道吗

但是在Python中,对象有很多“上下文”。例如,一些字节用于表示对象的类型等

然而,Numpy不是用Python实现的,它不是一个使用Python对象本身的库。它更像是一个用C实现的库,并且有一个很好的Python接口。因此,这意味着列表[1, 4, 2, 5]在Python中不是作为一个包含四个int对象引用的列表存储的,而是作为一个数组存储的,通常带有“unbox”元素。因此,上面的代码需要,假设int每个代码需要32位,4*32位,数组周围的“上下文”需要一些额外的空间。你知道吗

因此,物品以更节省空间的方式存储。这使得处理值变得更容易,因为我们这里不遵循指针,而是直接遵循值(有一些方法可以将引用存储在numpy数组中,但现在让我们忽略这一点)。此外,numpy数组占用的内存远远少于等效的Python列表(以及它所包含的项)。你知道吗

但是,如果从numpy数组中获取一个项,则需要为此创建一个Python对象。所以这意味着它将在这里构造一个numpy.float64对象,它包含这个值,但是仍然有很多关于这个值的“上下文”。这样会占用更多内存。你知道吗

事实上,numpy构造了一个包含特定类型对象的数组,这也带来了一些后果。例如,如果使用numpy.int16,则这意味着不能将大于32767的值存储到这些值中,因为该值不能用16位2补码表示:

>>> np.int16(32767)
32767
>>> np.int16(32768)
-32768

此外,如果不使用Python对象引用或其他一些“技巧”,就不能构造包含不同类型对象的数组。例如,Numpy构造一个int16数组,这意味着它将160位解释为10个16位的数字。在Python中,列表本身包含一个对对象的引用,Python对象知道它是什么类型,所以这意味着我们可以设置对另一个对象的引用。你知道吗

相关问题 更多 >

    热门问题