Python库numpy之五

Python库numpy之五

数据类型

数组类型和类型之间的转换

NumPy 比 Python 支持更多种类的数值类型。

NumPy 数值类型是 numpy.dtype对象的实例,每个对象都具有独特的特征。可以使用 numpy 顶级API中的标量类型创建具有指定 dtype 的数组,例如numpy.bool、numpy.float32 等

这些标量类型作为许多 numpy 函数或方法接受的 dtype 关键字的参数。例如:

z = np.arange(3, dtype=np.uint8)
print("z vale: {0} type: {1} element type: {2}".format(z, type(z), type(z[0])))

显示输出

javascript 复制代码
z vale: [0 1 2] type: <class 'numpy.ndarray'> element type: <class 'numpy.uint8'>

数组类型也可以通过字符代码引用,例如:

arr1 = np.array([1, 2, 3], dtype='f')
arr2 = np.array([1, 2, 3], dtype='d')
print("arr1 val: {0}, type: {1} element type: {2}".format(arr1, type(arr1), type(arr1[0])))
print("arr2 val: {0}, type: {1} element type: {2}".format(arr2, type(arr2), type(arr2[0])))

显示输出

javascript 复制代码
arr1 val: [1. 2. 3.], type: <class 'numpy.ndarray'> element type: <class 'numpy.float32'>
arr2 val: [1. 2. 3.], type: <class 'numpy.ndarray'> element type: <class 'numpy.float64'>

如果要转换数组的类型,可以使用 .astype() 方法。例如:

z = np.arange(3, dtype=np.uint8)
d = z.astype(np.float64)
d2 = z.astype(float)
print("z val: {0} type: {1} element type: {2}".format(z, type(z), type(z[0])))
print("d val: {0} type: {1} element type: {2}".format(d, type(d), type(d[0])))
print("d2 val: {0} type: {1} element type: {2}".format(d2, type(d2), type(d2[0])))

显示输出

javascript 复制代码
z val: [0 1 2] type: <class 'numpy.ndarray'> element type: <class 'numpy.uint8'>
d val: [0. 1. 2.] type: <class 'numpy.ndarray'> element type: <class 'numpy.float64'>
d2 val: [0. 1. 2.] type: <class 'numpy.ndarray'> element type: <class 'numpy.float64'>

上述代码中,d2使用 Python float 对象作为数据类型,而不是 numpy.float64。

NumPy 知道 int 指的是 numpy.int_,bool 指的是 numpy.bool,float 指的是 numpy.float64,complex 指的是 numpy.complex128。其他数据类型没有 Python 等效项。

要确定数组的类型,可以直接使用数值对象的dtype属性:

z = np.array([1,2,3], dtype=int)
d = z.astype('d')
print("z val: {0} type: {1}".format(z, z.dtype))
print("d val: {0} type: {1}".format(d, d.dtype))

显示输出

javascript 复制代码
z val: [1 2 3] type: int64
d val: [1. 2. 3.] type: float64

数值数据类型

有 5 种基本数值类型,

  • bool,布尔值
  • int,整数
  • uint,无符号整数
  • float,浮点
  • complex,复数

基本数字类型名称与数字位数相结合定义了具体类型。位数是在内存中表示单个值所需的位数。例如,numpy.float64 是 64 位浮点数据类型。某些类型,例如 numpy.int_ 和 numpy.intp,具有不同的位数,具体取决于平台,例如 32 位与 64 位 CPU 架构。

字符串和字节的数据类型

除了数字类型之外,NumPy 还支持下列类型

  • numpy.str_,U 字符代码,存储 unicode 字符串。
  • numpy.bytes_,S 字符代码)存储以 null 结尾的字节序列。
  • numpy.void,V 字符代码。

以上都是固定宽度的数据类型。它们通过宽度,以字节或 unicode 点为单位,进行参数化,数组中的单个数据元素必须适合该宽度。这意味着使用此数据类型存储字节序列或字符串数​​组需要提前了解或计算最长文本或字节序列的大小。

例如,我们可以创建一个数组来存储单词"hello"和"world!":

t1 = np.array(["hello", "world!"])
print("val: {0}  type: {1}".format(t1, t1.dtype))

显示输出

javascript 复制代码
val: ['hello' 'world!']  type: <U6

这里,数据类型被检测为 unicode 字符串,其长度最多为 6 个代码点,足以存储两个条目而不被截断。如果我们指定更短或更长的数据类型,则字符串将被截断或补零,以适合指定的宽度:

t1 = np.array(["hello", "world!"], dtype="U5")
t2 = np.array(["hello", "world!"], dtype="U7")

print("val: {0}  type: {1}".format(t1, t1.dtype))
print("val: {0}  type: {1}".format(t2, t2.dtype))

显示输出

javascript 复制代码
val: ['hello' 'world']  type: <U5
val: ['hello' 'world!']  type: <U7

对t1,最大长度为5, 所以字符!被截断。

如果我们使用 bytes 数据类型,并要求 NumPy 打印出数组缓冲区中的字节,我们可以更清楚地看到零填充:

t1 = np.array(["hello", "world"], dtype="S5").tobytes()
t2 = np.array(["hello", "world!"], dtype="S6").tobytes()
t3 = np.array(["hello", "world!"], dtype="S7").tobytes()

print("t1 val: {0}, type: {1} ".format(t1, type(t1)))
print("t2 val: {0}, type: {1} ".format(t2, type(t2)))
print("t3 val: {0}, type: {1} ".format(t3, type(t3)))
javascript 复制代码
t1 val: b'helloworld', type: <class 'bytes'>
t2 val: b'hello\x00world!', type: <class 'bytes'>
t3 val: b'hello\x00\x00world!\x00', type: <class 'bytes'>

\x00是填充字节。

相关推荐
梦想科研社4 分钟前
【无人机设计与控制】红嘴蓝鹊优化器RBMO求解无人机路径规划MATLAB
开发语言·matlab·无人机
混迹网络的权某7 分钟前
每天一道C语言精选编程题之求数字的每⼀位之和
c语言·开发语言·考研·算法·改行学it·1024程序员节
一只特立独行的猪6111 小时前
Java面试题——微服务篇
java·开发语言·微服务
Narutolxy1 小时前
探索开源语音识别的未来:高效利用先进的自动语音识别技术20241030
python·macos·xcode
Mopes__3 小时前
Python | Leetcode Python题解之第517题超级洗衣机
python·leetcode·题解
喵手3 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
硬汉嵌入式4 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
Wx120不知道取啥名4 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节
Python私教5 小时前
Flutter颜色和主题
开发语言·javascript·flutter
代码吐槽菌5 小时前
基于SSM的汽车客运站管理系统【附源码】
java·开发语言·数据库·spring boot·后端·汽车