本文中是对Numpy和Panadas使用的总结。
Numpy是c语言写的,Panadas是基于Numpy的升级版本。
使用矩阵计算,所以速度很快。在神经网络中也会运用到Panadas和Numpy的使用。
##安装
mac用户使用安装:
sudo pip install numpy
win用户可以安装anacoda。
Numpy基本属性
numpy是基于矩阵的运算。
一维的是序列,[1,2,4], 多行的是矩阵。
矩阵:一维或者多维的数组。
[[1,2,3],
[4,5,6]]
列表转换为矩阵
1 |
|
也可以指定float类型:dtype=np.float32或者dtype=np.float。后面的数字是位数,位数越大的,占用的空间越大,精度越大;位数越小的精度越小,但是占用空间越小。
numpy中有很多的类型,自行谷歌吧。
全为0或者1的矩阵
使用zeros方法:
In [15]: a = np.zeros((4,5), dtype=np.int16) # 注意2层括号
In [16]: a
Out[16]:
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
创建全为1的矩阵同理,使用ones()方法。
a = np.empty((3,4))
# 生成的是几乎接近为0的数字矩阵。
生成有序序列:
arange指定的是个数,reshape指定行列数。
In [18]: a = np.arange(100).reshape((10,10))
In [19]: a
Out[19]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
生成线段:
np.linspace(1, 20, 5):在1到20之间生成5段数字。会自动的进行分隔。
In [20]: m = np.linspace(1, 20, 5)
In [21]: m
Out[21]: array([ 1. , 5.75, 10.5 , 15.25, 20. ])
同样可以再后面加上reshape方法,指定形成的矩阵行列数。
numpy基础运算
对于加减乘逻辑运算是相同的形式:
In [34]: a = np.array([10,20,30,40])
In [35]: b = np.arange(5)
In [36]: a
Out[36]: array([10, 20, 30, 40])
In [37]: b
Out[37]: array([0, 1, 2, 3, 4])
a + b
a - b
a * b
a**2 # a的平方
使用sin或者cos或者tan需要np.sin或者np.cos方法等
In [44]: c = 10*np.sin(a)
In [45]: c
Out[45]: array([-5.44021111, 9.12945251, -9.88031624, 7.4511316 ])
比较矩阵中数字返回的是布尔值:
In [51]: b
Out[51]: array([0, 1, 2, 3, 4, 5])
In [52]: b>4 或者b<4 或者 b==4 等于要用双等于,
Out[52]: array([False, False, False, False, False, True], dtype=bool)
矩阵中乘法运算:
一对一的相乘:
In [57]: b
Out[57]: array([0, 1, 2, 3])In [58]: a
Out[58]: array([10, 20, 30, 40])In [59]: b*a
Out[59]: array([ 0, 20, 60, 120])使用矩阵相乘:
In [98]: a = np.array([[1,2],[4,5]])
In [99]: a
Out[99]:
array([[1, 2],[4, 5]])In [100]: b = np.arange(4).reshape((2,2))
In [101]: b
Out[101]:
array([[0, 1],[2, 3]])In [102]: np.dot(a,b) # 方法1
Out[102]:
array([[ 4, 7],[10, 19]])In [103]: a.dot(b) # 方法2
Out[103]:
array([[ 4, 7],[10, 19]])
随机生成数的矩阵
随机生成的是0到1数字:
In [104]: m = np.random.random((2,4)) # shape,2行4列
In [105]: m
Out[105]:
array([[ 0.84860133, 0.06700202, 0.94674506, 0.72577269],
[ 0.99062033, 0.70405729, 0.45466221, 0.8595076 ]])
矩阵中数字运算
矩阵 a
axis=1 是每列的运算结果
axis=0是每行的运算结果
矩阵中所有数字求和:np.sum(a,axis=1)
矩阵中所有数字求最小值:np.min(a, axis=0)
矩阵中所有数字求最大值:np.max(a)
找出矩阵中最大或者最小的索引:np.argmin(a) np.argmax(a)
矩阵数字的平均值:np.mean(a, axis=1 or 0) 或者a.mean() np.average(a),同样可以加上axis=1或者0的属性
求中位数: np.median(a)
逐步累加: np.cumsum(a)
逐步累差: np.diff(a)
找出非0的数字:np.norzero(a) # 不清楚
逐行排序:np.sort(a)
行列反转:np.transpose(a) 行转换为列,列转换为行
截取矩阵中某些数字: np.clip(a,min_number, max_number) # 大于 max_number的数字都变为max_number,小于min_number的数字都变为min_number
In [107]: a
Out[107]:
array([[1, 2],
[4, 5]])
In [108]: np.median(a)
Out[108]: 3.0
In [109]: np.cumsum(a)
Out[109]: array([ 1, 3, 7, 12], dtype=int32)
In [110]: np.diff(a)
Out[110]:
array([[1],
[1]])
# 将a矩阵反转之后在和原矩阵相乘
In [112]: np.transpose(a).dot(a)
Out[112]:
array([[17, 22],
[22, 29]])
矩阵数字索引
In [116]: r = np.arange(3,15).reshape((3,4))
In [117]: r
Out[117]:
array([[ 3, 4, 5, 6],
[ 7, 8, 9, 10],
[11, 12, 13, 14]])
In [118]: r[2][3] or r[2,3] 都是相同的作用
Out[118]: 14
In [119]: r[2,3]
Out[119]: 14
[120]: r[2] # 取出的是行索引值为2的
Out[120]: array([11, 12, 13, 14])
In [121]: r[:,2] # 取出列索引值为2的,前面的冒号是代表行
Out[121]: array([ 5, 9, 13])
In [122]: r[1, 1:4] # 出去第一行,第一列到第3列的数字。
Out[122]: array([ 8, 9, 10])
迭代矩阵的列和行:
numpy中只有行的迭代,没有列的迭代,但是可以先将矩阵转换,再for出来。
In [123]: for row in r:
…: print(row)
…:
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
# 列的迭代
In [124]: for col in r.T:
...: print(col)
...:
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
迭代每个数字
In [125]: r.flatten() # 将矩阵转为一维的
Out[125]: array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
In [126]: for x in r.flat: # 使用后flat方法
...: print(x)
...:
3
4
5
6
7
8
9
10
11
12
13
14
降维
直接使用reshape()方法也行
In [127]: r
Out[127]:
array([[ 3, 4, 5, 6],
[ 7, 8, 9, 10],
[11, 12, 13, 14]])
In [128]: r.reshape(2,6)
Out[128]:
array([[ 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14]])
合并矩阵
In [135]: a # 序列
Out[135]: array([1, 2, 3])
In [136]: b # 序列
Out[136]: array([4, 5, 6])
In [137]: np.vstack((a,b)) # vertical stack 上下的合并
Out[137]: # 合并之后是矩阵
array([[1, 2, 3],
[4, 5, 6]])
In [138]: np.hstack((a,b)) # 左右合并 horizontal stack
Out[138]: array([1, 2, 3, 4, 5, 6]) # 序列
如果是序列,使用transport是没用的。