python代码基础知识总结(二)
一、理论分析
如果想要在Al里混的很好,一些用起来得心应手的库必须要学会。比如numpy、pandas、matplotlib。这些都是针对python封装好的模块。我们在写代码时,只需要调用他们,然后记住它的函数名和参数就可以简单实现它的功能。
这里我们简单介绍一下python的简单库的使用。
- Numpy (Numerical Python)是Python的一种开源的数值计算扩展。它的底层是用C语言编写的,相比于python自身的运算速度更快。
- Pandas (pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)它是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。
- Matplotlib 是将matilb的强大绘图能力集成的库,具有强大的绘图能力。
二、代码分析
2.1 传统列表使用的困难
python是相对高级的语言,如果做大数据计算时,速度相对与C,C++十分缓慢,因此为了缓解这一问题numpy库应运而生。我们先来一个例子说明列表计算的不方便。
#调用numpy库
import numpy as np
#这个程序的意思就是调用numpy的包,为了下面调用的简写方便,我们将他改写为np
#类似的还有pandas,与plt
a=[1,2,3,4]
b=[5,6,7,8]
c=a+b #我想实现a和b对应元素相加
print(c)
#[1, 2, 3, 4, 5, 6, 7, 8]
#输出将列表连接了
d=[]
for i in range(0,len(a)):
d.append(a[i]+b[i])
print(d)
#[6, 8, 10, 12]
print(type(d))
#list
#可以看到d的类型是列表,说明了列表的加法对应列表的相连
可以看到,我在做两个列表相加时,结果是两个列表相连,这就很不合乎我们运算的习惯。由于相对于数据,更多的时矩阵之间的运算。这就很不适合。因此我们更多使用numpy库。
2.2 numpy的引入
arr_a=np.array(a)
print(arr_a)
#array([1, 2, 3, 4])
arr_b=np.array(b)
arr_b
#array([5, 6, 7, 8])
print(type(arr_a))
#numpy.ndarray
print(arr_a+arr_b)
#array([ 6, 8, 10, 12])
可以看到array数据类型的加法实现了对应元素的相加
讲到这里不得不说numpy的一个强大的功能,广播,举个例子,比如上面的arr_a,我想它每个元素都加1,必须要在一个和他一样大小的array而且元素必须都是1的吗?
print(arr_a+1)
#array([2, 3, 4, 5])
print(arr_a.shape)
#(4,)
#这里可以看到不要求大小相同,他会自动每个加一。
cc=np.array([[1,2,3,4],[5,6,7,8]])
print(cc)
#array([[1, 2, 3, 4],[5, 6, 7, 8]])
print(cc.shape)
#(2, 4)
data=np.linspace(-5,5,20)
print(data)
#array([-5. , -4.47368421, -3.94736842, -3.42105263, -2.89473684,
# -2.36842105, -1.84210526, -1.31578947, -0.78947368, -0.26315789,
# 0.26315789, 0.78947368, 1.31578947, 1.84210526, 2.36842105,
# 2.89473684, 3.42105263, 3.94736842, 4.47368421, 5. ])
#可以看到linspace函数自动的产生了从-5到5(闭区间)的20等分的数字。可以看到实际是要产生20个的元素。因为是从0开始计算所以可能与与其计算不同。每次变换10/19.
data=np.linspace(-5,5,21)
print(data)
#array([-5. , -4.5, -4. , -3.5, -3. , -2.5, -2. , -1.5, -1. , -0.5, 0. ,
# 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])
print(type(data))
#numpy.ndarray
date=np.arange(-5,5,2)
print(date)
#array([-5, -3, -1, 1, 3])
#而arange方法产生从-5到5(左闭右开),步长为2的array数据
print(type(date))
#numpy.ndarray
2.3 numpy 数据类型初始化
这个名字或许不太恰当,是我自己认为的。但是也算沾边,类似定义一个你想要多大的矩阵来运算。
print(np.ones([5,3]))
'''
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
'''
#这里可以看到产生了5行三列的单位矩阵
print(np.zeros([5,3]))
'''
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
'''
#这里可以看到产生了5行三列的零矩阵
print(np.eye(5,5))
'''
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
'''
#这里可以看到产生了5行三列的对角矩阵
x=np.arange(12)
print(x)
#array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
#如果仅仅给arrange一个数字的话,他会输出一个从0到比数字小一的一个array数据类型
x=x.reshape(3,4)
'''
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
#可以看到reshape可以将矩阵重构,第一个参数代表重构后的行数,第二个参数代表重构后的列数
#这里说一个小技巧,就是我不一定俩个参数都给,因为如果一个参数已知,另一个参数可以计算出来,那么其实我可以给参数赋值-1,python内部将会自动运算出结果。
x=x.reshape(-1,2)
'''
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
'''
#讲到重构类型,不得不说到将复杂的数据进行降维。
2.4 数据类型的降维函数ravel,flatten
y=x.reshape(1,-1)
print(y)
#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]])
print(y.shape)
#(1,12)
#可以看到数据还是二维的,有没有其他的方法呢?
m=x.ravel()
print(m)
#array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
print(m.shape)
#(12,)
n=y.flatten()
print(n)
#array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
2.5 numpy 数据之间的堆叠vstack,hstack
a=np.array([[1,2,3,4],[5,6,7,8]])
print(a)
'''
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
'''
b=np.array([[11,12,13,14],[21,22,23,24]])
print(b)
'''
array([[11, 12, 13, 14],
[21, 22, 23, 24]])
'''
c=np.vstack([a,b])
print(c)
'''
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[11, 12, 13, 14],
[21, 22, 23, 24]])
'''
#这个不难记,背个单词vertical 垂直的。我相信你记住了这个方法了,哈哈。类似的还有np.c_[a, b] column 列不动行相加
d=np.hstack([a,b])
print(d)
'''
array([[ 1, 2, 3, 4, 11, 12, 13, 14],
[ 5, 6, 7, 8, 21, 22, 23, 24]])
'''
#来再来背一个单词horizontal 水平的。类似的还有np.r_[a, b] row 行不动列相加
小结
这里我就简单说了一些常用的numpy使用的方法,这个是学习python高阶内容最入门的一个包了。读者必须要搞明白它的用法和使用机制,这样在之后学习深度学习的tensor数据类型时,才可以学的得心应手。后期会结合图像处理讲解pandas与matplotlib。小程序猿的内容永远免费展示,还希望大家读到这里,给予点赞支持!哈哈。