3. Numpy中的数据类型对象 ( dtype)

Numpy的dtype对象用于描述数组中元素的数据类型、大小、字节顺序和结构。它支持基本类型如int和float,以及结构化数组,允许不同列有不同的数据类型。大端和小端模式影响数据在内存中的存储方式。通过dtype,我们可以创建复杂的数据结构,并优化存储和性能。在示例中,展示了如何定义和使用int16类型创建二维数组。
摘要由CSDN通过智能技术生成

《玩转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对数据的描述

一个数据类型对象描述了应该如何解释与数组元素相对应的固定大小的内存块中的字节。 它描述了数据的以下方面:

  1. 数据类型(整数,浮点数,Python对象等)
  2. 数据大小(以整数为单位的字节数)
  3. 数据的字节顺序(小端或大端)
  4. 如果数据类型是结构化数据类型,则是其他数据类型的集合(例如,描述由整数和浮点数组成的一个数组元素),
    1. 该结构的字段(field)的名称是什么,通过它们可以访问它们;
    2. 每个字段的数据类型是什么;
    3. 每个字段占用存储块的哪一部分。
  5. 如果数据类型是子数组(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合理使用存储空间并优化性能

• 对元素类型精细定义,有助于程序员对程序规模有合理评估

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bai666ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值