一 numpy的简介
NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。
NumPy的主要功能:
- ndarray, 一个多维数据结构, 高新且节省空间
- 无需循环对数据进行快速运算的数学函数
- 线性代数 随机数生成和傅里叶变换功能
安装方法: pip install numpy
引用方式: import numpy as np
创建ndarray: np.adday(array_like)
数组与列表的区别:
- 数组对象内的元素类型必须相同
- 数组大小不可修改
二 Ipython的简介
再详细介绍Numpy之前先简单介绍一个下Ipython以便后面的操作
Ipython是再python环境下通过命令行交互式编程
安装:pip install ipython
使用:ipython
与Python解释器使用方法一致
1 高级功能
TAB键自动完成
?:内省, 命名空间搜索
!:执行系统命令
丰富快捷键:
2 魔术命令:以%开头
%run:执行文件代码
%paste:执行剪贴板代码
%timeit:评估运行时间
%pdb:自动调试
三 Numpy的使用
1 ndarray数据类型
- 布尔型:bool_
- 整形:int_ int8 int16 int32 int64
- 无符号整形: unit8 unit16 unit32 unit 64
- 浮点型:float float16 float32 float64
- 复数型:complex_ complex64 complex128
2 ndarray的常用属性
- T 数组的转置(对高维数组而言)
- size 数组元素的个数
- ndim 数组的维数
- shape 数组的维度大小(元祖形式)
- dtype 数组元素的数据类型
3 ndarray的创建
- array() 将列表转换为数组, 可选择显示指定dtype
- arange() range的numpy版, 支持浮点数
- linespace() 类似arange(),第三个参数为数组长度
- zeros() 根据指定形态和dtype创建全0数组
- ones() 根据指定形态和dtype创建全1数组
- empty() 根据指定形态和dtype创建空数组(随机值)
- eye() 根据指定边长和dtyoe创建单位矩阵
4 ndarray批量运算
数组和标量之间的运算
a+1 a*3 1//a a**0.5 a>5
同样大小数组之间的运算
a+b a/b a**b a%b a==b
5 ndarray索引和切片
一维数组的索引: a[5]
多维数组的索引:
- 列表式写法:a[2][3]
- 新式写法:a[2,3]
一维数组的切片: a[5:8] a[4:] a[2:10] = 1
多维数组的切片: a[1:2, 3:4] a[:,3:5] a[:,1]
数组切片与列表切片的不同:数组切片时并不会自动复制(而是创建一个视图),在切片数组上的修改会影响原数组
copy()方法可以创建数组的深拷贝
6 ndarray布尔型索引
给定一个数组选出数组中所有大于5的偶数
a[(a>5) & (a%2 == 0)]
给一个数组, 选出数组中所有大于5的数和偶数
a[(a>5) | (a%2==0)]
7 ndarray花式索引
对于一个数组,选出其第1,3,4,6,7个元素,组成新的二维数组
a[[1,3,4,6,7]]
对一个二维数组,选出其第一列和第三列, 组成新的二维数组
a[:,[1,3]]
8 ndarry通用函数
通用函数:能同时对数组中所有元素进行运算的函数
常见通用函数:
- 一元函数: abs, sqrt, exp, log, ceil(向上取整), floor(向下取整), rint, trunc(向零取整), modf(将整数和小数分开), isnan(判断是不是nan), isinf(判断是不是inf), cos, sin, tan
- 二元函数: add, substract, multiply, divide, power, mod, maximun, mininum
补充-浮点数特殊值
- nam(Not a Number):不等于任何浮点数(nan != nan)
- inf(infinity): 比任何浮点数都大
- NumPy中创建特殊值: np.nan np.inf
- 在数据分析中, nan常被用作表示数据缺失值
9 numpy数学和统计方法
[1 2 3 4 5]
- sum 求和
- mean 求平均数
- std 求标准差 ((1-3)**2+(2-3)**2+(3-3)**2+(4-3)**2+(5-3)**3)/5
- var 求方差
- min 求最小数
- max 求最大值
- argmin 求最小值索引
- argmax 去最大值索引
10 numpy随机数生成
- 随机数函数在np.random子包内
- rand 给定形态产生随机数组(0到1之间的数)
- randint 给定形态产生随机整数
- choice 给定形态产生随机选择
- shuffle 与random.shuff相同
- uniform 给定形态产生随机数组
四 Numpy示例
1. 使用np.array()创建
np.array([1,2,3,4,5]) array([1, 2, 3, 4, 5])
二维数组创建
np.array([[1,2,3],['a','b',1.1]])
array([['1', '2', '3'], ['a', 'b', '1.1']], dtype='<U11')
注意:
- numpy默认ndarray的所有元素的类型是相同的
- 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
- 使用matplotlib.pyplot获取一个numpy数组,数据来源于一张图片
2. 使用np的routines函数创建
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差数列
np.linspace(1,100,num=50) array([ 1. , 3.02040816, 5.04081633, 7.06122449, 9.08163265, 11.10204082, 13.12244898, 15.14285714, 17.16326531, 19.18367347, 21.20408163, 23.2244898 , 25.24489796, 27.26530612, 29.28571429, 31.30612245, 33.32653061, 35.34693878, 37.36734694, 39.3877551 , 41.40816327, 43.42857143, 45.44897959, 47.46938776, 49.48979592, 51.51020408, 53.53061224, 55.55102041, 57.57142857, 59.59183673, 61.6122449 , 63.63265306, 65.65306122, 67.67346939, 69.69387755, 71.71428571, 73.73469388, 75.75510204, 77.7755102 , 79.79591837, 81.81632653, 83.83673469, 85.85714286, 87.87755102, 89.89795918, 91.91836735, 93.93877551, 95.95918367, 97.97959184, 100. ])
np.arange([start, ]stop, [step, ]dtype=None)
np.arange(1,100,2) array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99])
np.random.randint(low, high=None, size=None, dtype='l')
np.random.seed(10)
arr = np.random.randint(0,100,size=(5,6))
np.random.random(size=None)
生成0到1的随机数,左闭右开 np.random.seed(3)
np.random.random(size=(3,3)) array([[0.765334 , 0.68742254, 0.12771576], [0.34878082, 0.46292111, 0.75355298], [0.08188152, 0.53189213, 0.17514265]])
3 ndarray的属性
4个必记参数:
- ndim:维度
- shape:形状(各维度的长度)
- size:总长度
- dtype:元素类型
img_arr.shape
(626, 413, 3)
img_arr.ndim
3
img_arr.size
775614
img_arr.dtype dtype('uint8')
4 ndarray的基本操作
索引
一维与列表完全一致 多维时同理
arr[[1,2]] array([[29, 8, 73, 0, 40, 36], [16, 11, 54, 88, 62, 33]])
切片
一维与列表完全一致 多维时同理
#获取二维数组前两行 arr[0:2] array([[ 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36]])
#获取二维数组前两列 arr[:,0:2] array([[ 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36]])
#获取二维数组前两行和前两列数据 arr[0:2,0:2] array([[ 9, 15], [29, 8]])
#将数据反转,例如[1,2,3]---->[3,2,1] #将数组的行倒序 arr[::-1] array([[69, 13, 25, 13, 92, 86], [72, 78, 49, 51, 54, 77], [16, 11, 54, 88, 62, 33], [29, 8, 73, 0, 40, 36], [ 9, 15, 64, 28, 89, 93]]) #列倒序 arr[:,::-1] array([[93, 89, 28, 64, 15, 9], [36, 40, 0, 73, 8, 29], [33, 62, 88, 54, 11, 16], [77, 54, 51, 49, 78, 72], [86, 92, 13, 25, 13, 69]]) #全部倒序 arr[::-1,::-1] array([[86, 92, 13, 25, 13, 69], [77, 54, 51, 49, 78, 72], [33, 62, 88, 54, 11, 16], [36, 40, 0, 73, 8, 29], [93, 89, 28, 64, 15, 9]])
5 变形
使用arr.reshape()函数,注意参数是一个tuple!
将一维数组变形成多维数组
arr_1.reshape((-1,15)) array([[ 9, 15, 64, 28, 89, 93, 29, 8, 73, 0, 40, 36, 16, 11, 54], [88, 62, 33, 72, 78, 49, 51, 54, 77, 69, 13, 25, 13, 92, 86]])
将多维数组变形成一维数组
arr_1 = arr.reshape((30,))
6 级联
一维,二维,多维数组的级联,实际操作中级联多为二维数组
array([[ 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36], [16, 11, 54, 88, 62, 33], [72, 78, 49, 51, 54, 77], [69, 13, 25, 13, 92, 86]]) # 行级联 np.concatenate((arr,arr),axis=1) array([[ 9, 15, 64, 28, 89, 93, 9, 15, 64, 28, 89, 93], [29, 8, 73, 0, 40, 36, 29, 8, 73, 0, 40, 36], [16, 11, 54, 88, 62, 33, 16, 11, 54, 88, 62, 33], [72, 78, 49, 51, 54, 77, 72, 78, 49, 51, 54, 77], [69, 13, 25, 13, 92, 86, 69, 13, 25, 13, 92, 86]]) #列级联 arr1 = np.random.randint(0,100,size=(5,5)) arr1 array([[30, 30, 89, 12, 65], [31, 57, 36, 27, 18], [93, 77, 22, 23, 94], [11, 28, 74, 88, 9], [15, 18, 80, 71, 88]]) np.concatenate((arr,arr1),axis=0)
级联需要注意的点:
- 级联的参数是列表:一定要加中括号或小括号
- 维度必须相同
- 形状相符:在维度保持一致的前提下,如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致。如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致。
- 可通过axis参数改变级联的方向
6 ndarray的排序
快速排序
np.sort()与ndarray.sort()都可以,但有区别:
- np.sort()不改变输入
- ndarray.sort()本地处理,不占用空间,但改变
np.sort(arr,axis=0) array([[ 9, 8, 25, 0, 40, 33], [16, 11, 49, 13, 54, 36], [29, 13, 54, 28, 62, 77], [69, 15, 64, 51, 89, 86], [72, 78, 73, 88, 92, 93]]) arr.sort(axis=0) array([[ 9, 8, 25, 0, 40, 33], [16, 11, 49, 13, 54, 36], [29, 13, 54, 28, 62, 77], [69, 15, 64, 51, 89, 86], [72, 78, 73, 88, 92, 93]])