《玩转Numpy计算库》视频课程
《玩转Numpy计算库》视频课程链接:https://edu.csdn.net/course/detail/28656
数据类型对象 ( dtype)
dtype (Data Type Objects)
数据类型对象dtype是numpy.dtype类的实例。它可以使用numpy.dtype创建。到目前为止,我们在numpy数组的例子中只使用了基本的数字数据类型,如int和float。这些numpy数组仅包含同类数据类型。
dtype对象还可以包括基本数据类型的组合。在dtype的帮助下,我们能够创建“结构化数组”(“Structured Arrays”),也称为“记录数组”(“Record Arrays”)。结构化数组使我们能够为每列提供不同的数据类型。它与excel或csv文档的结构相似。
dtype对数据的描述
一个数据类型对象描述了应该如何解释与数组元素相对应的固定大小的内存块中的字节。 它描述了数据的以下方面:
- 数据类型(整数,浮点数,Python对象等)
- 数据大小(以整数为单位的字节数)
- 数据的字节顺序(小端或大端)
- 如果数据类型是结构化数据类型,则是其他数据类型的集合(例如,描述由整数和浮点数组成的一个数组元素),
- 该结构的字段(field)的名称是什么,通过它们可以访问它们;
- 每个字段的数据类型是什么;
- 每个字段占用存储块的哪一部分。
- 如果数据类型是子数组(sub-array),则其形状和数据类型是什么。
大端模式 (big-endian)
是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式 (little-endian)
是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。
对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。
小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。
dtype举例:
dt = np.dtype('b') # byte, native byte order
dt = np.dtype('>H') # big-endian unsigned short
dt = np.dtype('<f') # little-endian single-precision float
dt = np.dtype('d') # double-precision floating-point number
dt = np.dtype('i4') # 32-bit signed integer
dt = np.dtype('f8') # 64-bit floating-point number
dt = np.dtype('c16') # 128-bit complex floating-point number
dt = np.dtype('a25') # 25-length zero-terminated bytes
dt = np.dtype('U25') # 25-character string
dt = np.dtype("i4, (2,3)f8, f4")
* field named f0 containing a 32-bit integer
* field named f1 containing a 2 x 3 sub-array of 64-bit floating-point numbers
* field named f2 containing a 32-bit floating-point number
例:一个包含32位big-endian整数的简单数据类型:
dt = np.dtype('>i4')
dt.byteorder
'>'
dt.itemsize
4
dt.name
'int32'
dt.type is np.int32
True
下面的例子中,我们定义一个int16的数据类型并调用它。 列表’lst’的元素被转换为i16类型以创建二维数组A.
import numpy as np
i16 = np.dtype(np.int16)
print(i16)
lst = [ [3.4, 8.7, 9.9],
[1.1, -7.8, -0.7],
[4.1, 12.3, 4.8] ]
A = np.array(lst, dtype=i16)
print(A)
int16
[[ 3 8 9]
[ 1 -7 0]
[ 4 12 4]]
ndarray的元素数据类型
查看ndarray支持的数据类型可访问:https://numpy.org/devdocs/user/basics.types.html
ndarray为什么要支持这么多种元素类型?
• 科学计算涉及数据较多,对存储和性能都有较高要求
• 对元素类型精细定义,有助于NumPy合理使用存储空间并优化性能
• 对元素类型精细定义,有助于程序员对程序规模有合理评估