前言:对于初学者来说,Python 是一个不错的语言,Python 语言简单易懂,而且有着丰富的数据库以及活跃的社区,对于大数据分析有很明显的帮助。学 Python 数据分析的,好好看我长篇文章。
Numpy
NumPy 软件包是 Python 生态系统中数据分析、机器学习和科学计算的主力军。它极大地简化了向量和矩阵的操作处理。Python 的一些主要软件包(如 scikit-learn、scipy、pandas 和 tensorflow)都以 NumPy 作为其架构的基础部分。除了能对数值数据进行切片(slice)和切块(dice)之外,使用 NumPy 还能为处理和调试上述库中的高级实例带来极大便利。
本节将介绍使用 NumPy 的一些主要常见方法,示例讲解如下。
创建、修改 array、shape 与 reshape 函数
>>> # 导入 numpy
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([[1, 2, 3], [4, 5, 6]])
>>> a.dtype
int32
>>> b.shape
(2 3)
>>> 将 b 的第一行第一列的 5 改为 10
>>> b[1,1]=10
>>> b
array([[ 1, 2, 3],
[ 4, 10, 6]])
>>> b.reshape(3,2)
array([[ 1, 2],
[ 3, 4],
[10, 6]])
函数 shape 属性获得数组的大小,通过 dtype 获得元素的属性。如果你想对数组里的数值进行修改的话,直接赋值即可,注意下标是从 0 开始计的。
数组切片和选取
Numpy 的切片和 Python 列表完全一样。一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step),当只有一个“:”时,默认第三个参数 step=1。
如下图所示,以 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 为例:
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a * 10
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
>>> a[2:8:2]
array([2, 4, 6])
>>> a[3:5] = a[3:5] *10
>>> a
array([ 0, 1, 2, 30, 40, 5, 6, 7, 8, 9])
>>> import numpy as np
>>> # 二维
>>> b = np.array([[1,2,3],[4,5,6]])
>>> b
array([[1, 2, 3],
[4, 5, 6]])
>>> b[:,1]
array([2, 5])
>>> b[:,0:2]
array([[1, 2],
[4, 5]])
数组的布尔值运用
布尔值也是 Python 中的一种数据类型,专门用来用于些逻辑判断。常用的布尔值分别有:~ 反、& 并、| 或 。
现在我们新建一个数组 a,现在取出其中元素值大于 3 且小于 6 的所有元素,并改为 0,其他为 1:
>>> a = np.arange(0,10,1)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.sum(a>5)
4
>>> np.sum(~(a>5))
6
>>> a[(a>3)&(a<6)] = 0
>>> a[~(a>3)&(a<6)] = 1
>>> a
array([1, 1, 1, 1, 1, 1, 6, 7, 8, 9])
axis 的应用
如下图所示,axis 实际上就是表示轴。对于一个二维空间,axis=1 代表横轴,axis=0 按照竖轴。
>>> a = np.array([[1,4],[3,2]])
>>> b = np.array([[5,6],[7,8]])
>>> concatenate 的将两个 Array 聚合起来
>>> np.concatenate((a,b),axis=0)
array([[1, 4],
[3, 2],
[5, 6],
[7, 8]])
>>> np.concatenate((a,b),axis=1)
array([[1, 4, 5, 6],
[3, 2, 7, 8]])
>>> 如果排序的时候,没有指定 axis,默认 axis=1
>>> np.sort(a)
array([[1, 4],
[2, 3]])
>>> np.sort(a, axis=0)
array([[1, 2],
[3, 4]])
>>> 如果需要运算,需要指定对应的 axis
>>> a.sum()
10
>>> a.sum(axis=0)
array([4, 6])
>>> a.sum(axis=1)
array([5, 5])
>>> 通过 ndim 查看 array 的维度
>>> a.ndim
2
数列的创建和算术运算
等比数列:logspace 中,开始点和结束点是 10 的幂,0 代表 10 的 0 次方,9 代表 10 的 9 次方。生成从 10 的 a 次方到 10 的 b 次方之间按对数等分的 n 个元素的行向量。
等差数列:linspace 是 linear space 的缩写,代表线性等分向量的含义。linspace() 通过指定 初始值、终值、元素个数 来创建等差数列的一维数组。注意:这个区间的端点可以任意的被排除在外。
通过 NumPy 可以自由地创建等差数组,同时也可以进行加、减、乘、除、求 n 次方和取余数。同时也可以进行加、减、乘、除、求 n 次方和取余数。
>>> # 在 100 和 1000 中生成 num=4 的等比序列
>>> np.logspace(2.0, 3.0, num=4)
array([ 100. , 215.443469 , 464.15888336, 1000. ])
>>> # endpoint=Falseb 表示 1000 不能在序列中
>>> np.logspace(2.0, 3.0, num=4, endpoint=False)
array([100. , 177.827941 , 316.22776602, 562.34132519])
>>> # base=2.0 表示不再以 10 的幂,而是以 2 作为幂
>>> np.logspace(2.0, 3.0, num=4, base=2.0)
array([4. , 5.0396842 , 6.34960421, 8. ])
>>> a = np.linspace(1,10,5)
>>> b = np.linspace(10,1,5)
>>> a
array([ 1. , 3.25, 5.5 , 7.75, 10. ])
>>> b
array([10. , 7.75, 5.5 , 3.25, 1. ])
>>> np.add(a, b) #加法
array([11., 11., 11., 11., 11.])
>>> np.subtract(a, b) #减法
array([-9. , -4.5, 0. , 4.5, 9. ])
>>> np.multiply(a, b) #乘法
array([10. , 25.1875, 30.25 , 25.1875, 10. ])
>>> np.divide(a, b) #除法
array([ 0.1 , 0.41935484, 1. , 2.38461538, 10. ])
>>> np.power(a,b) #乘方
array([1.00000000e+00, 9.27034822e+03, 1.18030648e+04, 7.76659275e+02,
1.00000000e+01])
>>> np.remainder(a, b) #取余数
array([1. , 3.25, 0. , 1.25, 0. ])
重要 random 的函数
rand:根据给定维度生成 [0,1) 之间的数据,包含 0,不包含 1
randn:返回均值=0,标准差=1,具有标准正态分布
normal:normal 是正态分布,但可以修改均值和标准差,第一个是均值,第二个是标准差,还可以传入 size
randint:返回随机整数,范围区间为[low,high),包含 low,不包含 high
choice:从给定的区间生成相对应个随机数
>>> np.random.rand(3,4)
array([[0.00910588, 0.26719767, 0.96195156, 0.66325403],
[0.77108254, 0.73961889, 0.4332318 , 0.6130871 ],
[0.24454375, 0.96344155, 0.91942036, 0.16383334]])
>>>np.random.randn(3,4)
array([[0.31124855, 0.3970361 , 0.86046835, 0.36587692],
[0.94543601, 0.84770308, 0.13784751, 0.69106204],
[0.80672147, 0.78469807, 0.12474456, 0.38386812]])
>>> np.random.normal(5,1,size=(3, 4))
array([[5.05484712, 5.11948961, 4.74160469, 5.73573086],
[4.93939144, 6.52482878, 3.83668001, 6.62767368],
[4.74056406, 4.00017621, 6.32218076, 5.48900825]])
>>> np.random.randint(1, 10, 10)
array([3, 2, 6, 5, 7, 6, 6, 5, 1, 3])
>>> # 从给定的 0 到 3 中生成 3 个随机数
>>> np.random.choice(3,3)
array([2, 0, 2])
如果想每次都固定随机数,需要设置 seed 随机种子: