【问题标题】:How Numpy array store data in memory?Numpy数组如何在内存中存储数据?
【发布时间】:2021-07-31 06:22:36
【问题描述】:
a = [5,6,7,8]

print('for list:')
for i in a:
  print((id(i)))

import numpy as np

z = np.array([9,10,11,12])
print('for numpy:')
for i in z:
  print((id(i)))

注意:当我试图查看列表中值的内存地址时,它需要 32 位的连续内存。但是当我将列表转换为 Numpy 数组并打印值的地址时,备用值采用相同的内存地址。我不明白为什么会这样?

output:
 
for list:
94620302609024
94620302609056
94620302609088
94620302609120

for numpy:
139853895184240
139853895279216
139853895184240
139853895279216

正如您所见,对于 numpy 数组,备用值的内存地址是相同的。 请解释一下为什么会这样?

【问题讨论】:

  • 你检查stackoverflow.com/questions/40196986/numpy-arrays-changing-id了吗?以下是要考虑的重要点 In contrast to a list, values of an array are stored as bytes in a databufferIn general, id is not useful when working with arrays 最重要的是 id 指向 cpython 中的内存位置
  • 不是machine-learning 问题,请不要向无关标签发送垃圾邮件(已删除)。

标签: python arrays list numpy


【解决方案1】:

首先,id() 不一定返回内存地址;它恰好在 CPython 中这样做是一个实现细节。同样重要的是要意识到一个 id 仅在对象存在时才有效。如果一个对象已被垃圾回收,则可能会创建一个具有相同 id 的新对象。

内置的 Python 列表类型不存储对象,它存储对对象的引用。这就是为什么同一个对象可能同时是多个列表的成员。 (或 dicts,或只是简单的变量。)

Numpy 数组(通常)根本不存储 Python 对象——这将非常低效,这也是我们首先使用 numpy 的原因之一!这意味着当你遍历一个 ndarray 时,必须为每个数字创建一个对象,因为它被拉出数组。所以你看到的 id:s 不是存储数字的 id:s——它们不是对象,因此没有 id:s! — 但创建的临时对象的 id:s。而且由于您没有保留这些对象,而是在每次循环迭代后将它们丢弃,因此新对象有时会获得与旧对象相同的 id 也就不足为奇了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2013-11-03
    • 2020-12-23
    • 2022-01-18
    • 1970-01-01
    • 2016-11-07
    • 2012-05-28
    相关资源
    最近更新 更多