使用Python时,我遇到了一个困扰我很长时间的问题。说,我使用numpy来定义数组x = np.array([1, 2])
。
我认为这意味着x
是类array
的一个实例。此外,该教程还说[1,2]
实际上存储在x.data
中。但我在Python中通过实例名称[1,2]
而不是x
获取数据x.data
。
这是怎么发生的?实例名称x
和x.data
之间有一个链接?
答案 0 :(得分:4)
x
和x.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位)组成。这意味着x
,x.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。
x
和x.data
之间的链接是x.data
指向您在检查x
时看到的值的内存位置。 numpy
使用ndarray
类型作为内存中较低级别存储的抽象,以便在高级别处理数组,例如在索引处获取x
的值之一:
In [8]: x[1]
Out[8]: 2
而不需要自己实现正确的偏移和二进制到整数转换。