跳转至

numpy数组元素的类型

使用dtype快速定义ndarray的数据类型 #card

# 利用dtype关键字,传入合适的数据类型,显式地定义
arr2 = np.array(data1, dtype=np.float32)
arr2

# Out: array([[1., 2., 3., 4.],
#            [5., 6., 7., 8.]], dtype=float32)

# 查看arr2的数据类型,这里实际上只查看的arr2的组成元素的数据类型
arr2.dtype

# Out: dtype('float32')

# 查看arr2的各维度的大小,其结果用tuple表示。
# tuple的长度,表示数组的维数;具体值表示数组的大小
arr2.shape

# Out: (2, 4)      # 表示该数组是2×4大小

Python支持基础的数据类型有int,float,bool,string,complex等,Numpy则在此基础上进行了拓展,不过你并不需要进行死记硬背,记住常用的即可,用到的时候可以查表。Numpy支持常用的数据类型如下:

类型 说明
int8、uint8 分别表示有符号和无符号的8位整型,可表示的整数范围为-128 ~ 127、0 ~ 255
int16、uint16 分别表示有符号和无符号的16位整型,可表示的整数范围为-32768 ~ 32767、0 ~ 65535
int32、uint32 分别表示有符号和无符号的32位整型,可表示的整数范围为-2147483648 ~ 2147483647、0 ~ 4294967295
int64、uint64 分别表示有符号和无符号的64位整型,可表示的整数范围为-9223372036854775808 ~ 9223372036854775807、0 ~ 18446744073709551615
float16、float32、float64、float128 分别表示半精度浮点数、单精度浮点、双精度浮点、扩展精度浮点数
complex64、complex128、complex256 分别用两个32位、64位、128位的浮点数表示的复数
bool 存储True和False值的布尔类型
Object Python对象类型
string 类型代号S,固定长度的字符串类型,每个字符1个字节
unicode 类型代号U,固定长度的unicode类型,跟字符串的定义方式一样,例如(U8)

这里我们分别举一个布尔类型和字符串类型的例子,熟悉一下定义的规则:

# 通过整形1和0,定义布尔类型的数组
data2 = [[1, 0], [0, 1]]
arr3 = np.array(data2, dtype=bool)
arr3

# Out: array([[ True, False],
#           [False,  True]])

# 查看arr3的数据类型
arr3.dtype
# Out: dtype('bool')

# 尝试传入其它的数据类型,来定义布尔类型的数组,看一看会得到什么神奇的结果

data4 = [["a", "b"], ["c", ""]]
arr4 = np.array(data4, dtype=np.bool)
arr4


# Out: array([[ True,  True],
#            [ True, False]])

astype函数更改ndarray的数据类型

data6 =[[1.230, 2.670],[1.450, 6.000]]
arr6 = np.array(data6, np.float32)
arr6
arr6.astype(np.float16)
Out: array([[ 1.230,  2.670],
           [ 1.450,  6.000]], dtype=float16)

arr6.astype(np.int8)
Out: array([[1, 2],
           [1, 6]], dtype=int8)

虽然上面的操作中我们改变了 arr6 的数据类型,但是打印一下 arr6 你会发现,arr6 原始的的数据类型并没有发生变化:

arr6
# Out: array([[ 1.230,  2.670],
#          [ 1.450,  6.000]], dtype=float32)

如果只是按照上述方式,显式地更改数据类型,被操作对象arr6并没有发生更改。这是因为astype函数会返回更改数据类型后的新的数组。因此如果你想要保存更改后的结果,你需要将astype函数结果赋值给一个新命名的变量。

dtype只接受Numpy能够识别的数据类型,因此,在数据类型之前需要加上np. ,当然传入Python原生的数据格式,比如intfloat,也是可以的。

注意:在np.floatnp.int之间的互相转化中,float的小数部分会被直接抹去,仅仅保留整数部分,并非是四舍五入的方式。

数组的格式化输出

在实际应用中,有这样一种场景:浮点数的小数位过多,我们希望格式化地print数组的结构,比如保留3位有效数字,但是并不想改变原数组的值。其实在Numpy中已经封装好了这种方法,一行代码就能搞定:

使用np.set_printoptions()可以指定数字的精度:

# precision: 默认保留8位位有效数字,后面不会补0;suppress: 对很大/小的数不使用科学计数法 (True)
np.set_printoptions(precision=3, suppress=True)
# 对浮点数数组,保留3位有效数字,并禁用科学计数法;小数位数不够,后面不会补0
arr7 = np.array([3.141592653,9.8888])  # 定义一个2维数组
print(arr7)

# out: [3.1416 9.8888]

#当然了,你也可以利用Python的语法规范,灵活地自定义数据的print效果:
# 对浮点数,保留小数点后3位
np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
arr7

# Out: array([[ 3.141],
#           [ 9.797]], dtype=float16)

参考文献

  1. 数据类型对象(dtype) | NumPy 中文

最后更新: 2022年10月15日 01:02:48
创建日期: 2022年7月27日 11:10:25
Contributers: yangjh