python数据处理之numpy和pandas(上)
前言:
学习python的基本语法已经半月了,对基本的语句操作也有所熟悉,在学习中主要参考的是廖雪峰老师的python教程,感觉受益很多,文章下面各方前辈的评论也是很好的学习教程,能让我知道错误的原因和解决方法。网址为:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000。最近也一直在看前百度人工智能首席专家吴恩达老师在网易云课堂上免费开放的《神经网络和机器学习》课程,地址为:http://study.163.com/my#/smarts目前已经进行三周,对两层神经网络以及正反向传播都有些了解了,磨刀不误砍柴工,考过研的都明白一句话,基础不牢,地动山摇!所以我还是想着跟着一个老师或者前辈将python中一些常用的库学习一下。
偶然间在知乎上看到莫烦老师的网站主打python,又恰逢今年毕业的师兄所入职的南京烽火,校招网址:http://njau.91job.gov.cn/campus/view/id/674916对TensorFlow和caffe等有所要求,以及神经网络KNN和CNN方面也有要求,我也在知乎上和其他地方询问一些前辈,烽火公司还是很符合我的预期,所以自己也朝着这方面自学,以求毕业的时候能够达到烽火的招聘标准吧。哈哈,说了这么多,现在就开始吧!
numpy:
数据处理方面,python简直是最好用的语言工具,numpy和pandas是其数据处理最好用的“臂膀”。在开始之前,Windows和Linux用户建议您安装anaconda3,免去了后续一些基本包的安装,也减少了出错几率。神经网络最最基本的运算时来自于矩阵运算。第一步我们开始进行一个矩阵的赋值,显示和规格参数描述,在此之前,我默然您也跟我一样有过其他的语言的基础,也有python的基础。
1.矩阵赋值和规格参数显示
-
import numpy
as np
-
A = np.array([[
1,
2,
3],
-
[
2,
3,
4]])
-
print(A)
导入
numpy
库简写为
np,
利用
np.array()
来进行赋值,注意,一个
2
行
3
列的矩阵应该是
[[1,1,1],[1,1,1]],
最外面是有一对方括号的。那么输出结果自
然为:
-
[[
1
2
3]
-
[
2
3
4]]
接着我们需要探查一下矩阵的维度,类型和元素个数:
-
print(
'number of dim:',A.ndim)
-
print(
'shape:',A.shape)
-
print(
'size:',A.size)
则结果相对应的为:
-
number of dim:
2
-
shape: (
2,
3)
-
size:
6
接下来是创建矩阵,注意啊,创建矩阵是通过函数赋值,而上面赋值矩阵是咱们自己赋值给矩阵空间的。
-
import numpy
as np
-
A = np.array([[
2,
2.3,
4],
-
[
2,
3.2,
4]])
-
A0 = np.zeros((
3,
4))
-
A1 = np.ones((
2,
3),dtype=np.int16)
-
Amin = np.empty((
3,
4))
-
Arange = np.arange(
12).reshape((
3,
4))
-
Aline = np.linspace(
1,
10,
6).reshape((
2,
3))
-
print(A)
-
print(A0)
-
print(A1)
-
print(Amin)
-
print(Arange)
-
print(Aline)
下面来解释这段numpy的使用。A是赋值矩阵,也就是前面提到的,A0就是将矩阵的每个元素都设为0,后面的(3,4)即3行4列,完全可以根据自身需要去设置一个全零的任意行任意列的矩阵。A1是设置矩阵元素为全1,(2,3)与之同理,注意后面的dtype,这是设置矩阵的元素的数据类型,可以为整型int,64位,32位和16位等,也可以是浮点型float长度同前,这个根据自身处理数据的需要来进行设定。Amin是建立一个近似于0的最小数的矩阵,可以快速的进行内存空间的分配。Arange是创建一个(3,4)的矩阵,数值为0-11共12个数,也可以设置为一个区间,但数量必须和reshape的矩阵元素个数相同。Aline是进行线段化一段数据,如上1-10之间分六段,这六段的结构为(2,3)的矩阵。这就是矩阵创建的相关知识。运行结果如下所示:
-
[[
2.
2.3
4. ]
-
[
2.
3.2
4. ]]
-
[[
0.
0.
0.
0.]
-
[
0.
0.
0.
0.]
-
[
0.
0.
0.
0.]]
-
[[
1
1
1]
-
[
1
1
1]]
-
[[
0.
0.
0.
0.]
-
[
0.
0.
0.
0.]
-
[
0.
0.
0.
0.]]
-
[[
0
1
2
3]
-
[
4
5
6
7]
-
[
8
9
10
11]]
-
[[
1.
2.8
4.6]
-
[
6.4
8.2
10. ]]
2.numpy基础运算
-
import numpy
as np
-
a = np.array([
10,
20,
30,
40])
-
b = np.arange(
4)
-
print(a,b)
-
print(a>
20,b<
3)
-
c = a-b
-
d = a+b
-
e = a*b
-
f = b**
2
-
g =
10*np.sin(a)
#cos tan等
-
-
-
print(c)
-
print(d)
-
print(e)
-
print(f)
-
print(g)
在一个矩阵中,如果想设定阈值找到哪几个元素是大小某值,小于某值或者等于某值的时候,可以直接写成(print(a>T)或者(print(a<T))或(print(a==T))),这样就会返回与a相同维数的矩阵,里面的值是布尔类型,即满足条件为True,否则为False。两个矩阵相加减与int类型数据相加同样,这里两个矩阵相乘并不是线性代数中矩阵相乘,而是各个元素之间分别相乘,若是矩阵相乘,则需要使用no.dot(),下一例中有所涉及。求一个矩阵中所有元素的平方为f =b**2,三次方为b**3,求某个数值的三角函数直接用np.sin(),np.cos()等等。
运算结果为:
-
[
10
20
30
40] [
0
1
2
3]
-
[
False
False
True
True] [
True
True
True
False]
-
[
10
19
28
37]
-
[
10
21
32
43]
-
[
0
20
60
120]
-
[
0
1
4
9]
-
[
-5.44021111
9.12945251
-9.88031624
7.4511316 ]
线性代数中矩阵的运算:
-
import numpy
as np
-
a = np.array([[
1,
1],
-
[
0,
1]])
-
b = np.arange(
4).reshape(
2,
2)
-
print(a)
-
print(b)
-
c = a*b
-
c_dot = np.dot(a,b)
-
c_dot_1 = a.dot(b)
-
print(c)
-
print(c_dot)
-
print(c_dot_1)
这里两个矩阵进行线性代数中的乘法运算,有两种方式,第一种是np.dot(a,b),第二种为a.dot(b),运算结果如下:
-
[[
1
1]
-
[
0
1]]
-
[[
0
1]
-
[
2
3]]
-
[[
0
1]
-
[
0
3]]
-
[[
2
4]
-
[
2
3]]
-
[[
2
4]
-
[
2
3]]
求矩阵中某一行某一列中数值已经某行某列求和:
-
import numpy
as np
-
a = np.random.random((
2,
4))
-
print(a)
-
print(np.sum(a))
-
print(np.max(a))
-
print(np.min(a))
-
print(np.sum(a,axis=
1))
-
print(np.min(a,axis=
0))
-
print(np.min(a,axis=
1))
这里面,根据函数的名字就能直观了解功能,需要强调的是,axis的赋值问题,axis=0就是关注的某一列的问题,axis=1就是关注的某一行的问题。经过编译输出结果为:
-
[[
0.2706944
0.48027564
0.00835308
0.83170055]
-
[
0.31429675
0.54158937
0.87013878
0.25754769]]
-
3.57459626981
-
0.870138784946
-
0.00835308363163
-
[
1.59102368
1.98357259]
-
[
0.2706944
0.48027564
0.00835308
0.25754769]
-
[
0.00835308
0.25754769]
3.numpy中的一些内置函数
以下介绍一些numpy本身自带的数据处理函数:
-
import numpy
as np
-
a = np.arange(
2,
14).reshape((
3,
4))
-
-
-
print(a)
-
print(np.argmin(a))
#最小索引值
-
print(np.argmax(a))
-
print(np.mean(a))
#与下一行代码相同
-
print(a.mean())
-
print(np.mean(a,axis=
0))
-
print(np.median(a))
#中位数
-
print(np.cumsum(a))
#第i个数是前i个数相加
-
print(np.diff(a))
#累差,i=i+1-i
-
#print(np.nonzero(a))
-
print(np.transpose(a))
#矩阵的转置,行变列,同下
-
print(a.T)
-
print(np.clip(a,
5,
9))
#阈值控制,大于某值就为某值,小于类似
以上函数中,np.argmin和np.argmax为索引函数,即找到最小最大值得位置在哪,返回int型位置数,求均值可以用np.mean()与a.mean()类似,其中要想求出每一行或者每一列的均值只需要对axis进行赋值0,1即可。np.median求中间数,虽然在此程序中与mean函数得到的结果是一样的,但意义不同,median求得是矩阵最中间的数值而不是平均值。np.cumsum是累加求和函数,即第i个数是前i个数相加得来的结果,而np.diff是累差,第i和数是后面一个数减去i自身得来的新的数。np.transpose是矩阵转置函数,即行变列,列变行,其结果和(a,T)一样,np.clip是阈值函数,即大于某值的数统统等于那个值,小于某值的数统统等于此值。函数功能介绍完毕,下面展示运行结果:
-
[[
2
3
4
5]
-
[
6
7
8
9]
-
[
10
11
12
13]]
-
0
-
11
-
7.5
-
7.5
-
[
6.
7.
8.
9.]
-
7.5
-
[
2
5
9
14
20
27
35
44
54
65
77
90]
-
[[
1
1
1]
-
[
1
1
1]
-
[
1
1
1]]
-
[[
2
6
10]
-
[
3
7
11]
-
[
4
8
12]
-
[
5
9
13]]
-
[[
2
6
10]
-
[
3
7
11]
-
[
4
8
12]
-
[
5
9
13]]
-
[[
5
5
5
5]
-
[
6
7
8
9]
-
[
9
9
9
9]]