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
并没有发生更改。这是因为astype
函数会返回更改数据类型后的新的数组。因此如果你想要保存更改后的结果,你需要将astype
函数结果赋值给一个新命名的变量。
dtype
只接受Numpy
能够识别的数据类型,因此,在数据类型之前需要加上np.
,当然传入Python原生的数据格式,比如int
或float
,也是可以的。
注意:在np.float
与np.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)
参考文献¶
最后更新:
2022年10月15日 01:02:48
创建日期: 2022年7月27日 11:10:25
创建日期: 2022年7月27日 11:10:25
Contributers: