为什么我们可以使用变量名来获取存储在其中的数据?

时间:2017-07-06 04:53:09

标签: python arrays numpy

使用Python时,我遇到了一个困扰我很长时间的问题。说,我使用numpy来定义数组x = np.array([1, 2])

我认为这意味着x是类array的一个实例。此外,该教程还说[1,2]实际上存储在x.data中。但我在Python中通过实例名称[1,2]而不是x获取数据x.data

这是怎么发生的?实例名称xx.data之间有一个链接?

1 个答案:

答案 0 :(得分:4)

xx.data是不同的类型,但它们是从内存中的同一位置解释数据

In [1]: import numpy as np

In [2]: x = np.array([1,2])

In [3]: type(x)
Out[3]: numpy.ndarray

In [4]: type(x.data)
Out[4]: buffer

x.data是指向组成内存中数组对象的字节的底层缓冲区的指针,在numpy docs中引用。

当我们检查基础数据类型(dtype)时,数组正在存储数据,如下所示:

In [5]: x.dtype
Out[5]: dtype('int64')

int64由64位或8字节(一个字节中的8位)组成。这意味着xx.data的基础缓冲区应该是长度为16的buffer。我们在此确认:

In [6]: len(x.data)
Out[6]: 16

最后,我们可以查看缓冲区的实际值,看看Python如何将值存储在内存中:

In [7]: for i in range(len(x.data)): print ord(x.data[i])
1
0
0
0
0
0
0
0
# first 8 bytes above, second 8 below
2
0
0
0
0
0
0
0

我们使用ord返回字节的值,因为numpy将值存储为8位(1字节)字符串。

因为,这些字节中的每一个只存储8位信息,所以循环打印的上述值都不会超过255,the maximum value of a byte

xx.data之间的链接是x.data指向您在检查x时看到的值的内存位置。 numpy使用ndarray类型作为内存中较低级别存储的抽象,以便在高级别处理数组,例如在索引处获取x的值之一:

In [8]: x[1]
Out[8]: 2

而不需要自己实现正确的偏移和二进制到整数转换。