乐哥学AI_Python(一):Numpy基础知识
NumPy入门详解
什么是NumPy?
NumPy是Python中一个用于科学计算的包,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。
NumPy基础
Numpy的主要对象是同种元素的多维数组。一个数组中的所有元素都是同一种类型,通过正整数元组索引的元素表格(通常元素是数字)。在Numpy中dimensions-纬度叫做axes-轴,轴的个数叫做rank-秩(zhì)。
例如,下面的例子中,这个数组的秩为2(它是二维的)。它的第一纬度(轴)长度为2,第二纬度的长度为3。
[[ 1, 1., 1], [ 2, 2, 2]]
Numpy提供的最重要数据类型有:
1.float64 64位浮点数
2.float32 32位浮点数
3.int64 64位整数
4.int32 32位整数
5.bool 8位 True 或者 False
(查询当前多维数组可以用Python内嵌的type()函数)
转换数据类型
可以通过ndarray的astype方法显式地转换其dtype。
arr = np.array([1,2,3]) print(arr.dtype) float_arr = arr.astype(np.float32) print(float_arr.dtype)
(一类数据在位数切换时只能表示近似的分数值,在复杂计算中,由于可能会积累一些浮点错误,因此比较操作只能在一定小数位以内有效。)
Numpy的基本对象:ndarray&func
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
此外Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
NumPy的诞生弥补了这些不足,NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray(下文统一称之为数组)是存储单一数据类型的多维数组,而ufunc是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。
常用ndarray属性:
- dtype 描述数组元素的类型
- shape 以tuple表示的数组形状
- ndim 数组的维度
- size 数组中元素的个数
- itemsize 数组中的元素在内存所占字节数
- T 数组的转置
- flat 返回一个数组的迭代器,对flat赋值将导致整个数组的元素被覆盖
- real/imag 给出复数数组的实部/虚部
- nbytes 数组占用的存储空间
常用ndarray方法:
- reshape(…) 返回一个给定shape的数组的副本
- resize(…) 返回给定shape的数组,原数组shape发生改变
- flatten()/ravel() 返回展平数组,原数组不改变
- astype(dtype) 返回指定元素类型的数组副本
- fill() 将数组元素全部设定为一个标量值
- sum/Prod() 计算所有数组元素的和/积
- mean()/var()/std() 返回数组元素的均值/方差/标准差
- max()/min()/ptp()/median() 返回数组元素的最大值/最小值/取值范围/中位数
- argmax()/argmin() 返回最大值/最小值的索引
- sort() 对数组进行排序,axis指定排序的轴;kind指定排序算法,默认是快速排序
- view()/copy() view创造一个新的数组对象指向同一数据;copy是深复制
- tolist() 将数组完全转为列表,注意与直接使用list(array)的区别
- compress() 返回满足条件的元素构成的数组
多维数组ndarray内存结构:
如下图所示,关于数组的描述信息保存在一个数据结构中,这个结构引用两个对象:一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象。
NumPy数组高效原因:
NumPy数组基本上是由元数据(维数、形状、数据类型等)和实际数据构成。数据存储在一个均匀连续的内存块中,该内存在系统内存(随机存取存储器,或RAM)的一个特定地址处,被称为数据缓冲区。这是和list等纯Python结构的主要区别,list的元素在系统内存中是分散存储的。这是使NumPy数组如此高效的决定性因素。
在内存中数据占用的空间:
一个空的 numpy 数组,无论什么类型,都是占用 96 个字节(byte)。
一个 32位的数据类型(int32/float32) 都是占用 4 个字节,而64位的都占用 8 个字节。
多维数组的创建函数