Python3 数据科学(二):Numpy
Numpy 入门介绍
对于数据分析来说,最常见的数据的格式是数组类型的,为了方便的对这种数据进行表示以及处理,便出现了 numpy 这个数据科学工具库。
一、使用numpy创建数组
import numpy as np
使用python列表来创建数组
list_1 = [1,2,3,4,5]
使用 np 中的 array 方法来创建一维数组,传入一个列表
array_1 = np.array(list_1)
array_1
array([1, 2, 3, 4, 5])
list_2 = [6,7,8,9,10]
创建二维数组,传入对象也是一个列表
array_2 = np.array([list_1,list_2])
array_2
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
使用numpy 中的 arange 方法来创建数组
arange(start,end,step)
array_3 = np.arange(1,10)
array_3
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(1,10,2)
array([1, 3, 5, 7, 9])
使用numpy中的zeros来创建0矩阵
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros([4,6])
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
使用numpy 中的 eye方法来创建单位矩阵
np.eye(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.]])
使用 numpy 中的 ones 方法来创建数组
np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
可以指定创建的数组的格式
np.ones((3,5), dtype=np.int32)
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=int32)
创建两个数组,纬度为 3*5
np.ones((2,3,5), dtype=np.int32)
array([[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]], dtype=int32)
使用 numpy 中的 random 来快速的创建数组
使用randn 方法来创建给定个数的符合正态分布的随机数组
np.random.randn(10)
array([ 1.49329335, -0.19607173, -1.38688767, -0.66481528, -0.41751835,
1.41316847, -0.29155437, 0.64598281, 0.55834756, 0.86754489])
使用randint 方法来创建在给定范围内的的随机int数
np.random.randint(10)
2
使用randint 方法传入指定的size 便可以创建指定大小的随机的数组
np.random.randint(10,size=(2,3))
array([[2, 9, 1],
[4, 6, 1]])
np.random.randint(10,size=10)
array([5, 7, 9, 2, 8, 9, 5, 4, 6, 4])
使用 random 中的 random 方法来创建从0到1的随机数
np.random.random()
0.46541015425031074
np.random.random((2, 3))
array([[0.62410458, 0.40864464, 0.64083039],
[0.0934563 , 0.90201295, 0.0297017 ]])
使用 numpy 中的 linspace 方法来创建数组
linspace(start,end,count)
此方法会从start开始到end结束,均匀的创建个数为count个一维数组
np.linspace(1, 10, 100)
array([ 1. , 1.09090909, 1.18181818, 1.27272727, 1.36363636,
1.45454545, 1.54545455, 1.63636364, 1.72727273, 1.81818182,
1.90909091, 2. , 2.09090909, 2.18181818, 2.27272727,
2.36363636, 2.45454545, 2.54545455, 2.63636364, 2.72727273,
2.81818182, 2.90909091, 3. , 3.09090909, 3.18181818,
3.27272727, 3.36363636, 3.45454545, 3.54545455, 3.63636364,
3.72727273, 3.81818182, 3.90909091, 4. , 4.09090909,
4.18181818, 4.27272727, 4.36363636, 4.45454545, 4.54545455,
4.63636364, 4.72727273, 4.81818182, 4.90909091, 5. ,
5.09090909, 5.18181818, 5.27272727, 5.36363636, 5.45454545,
5.54545455, 5.63636364, 5.72727273, 5.81818182, 5.90909091,
6. , 6.09090909, 6.18181818, 6.27272727, 6.36363636,
6.45454545, 6.54545455, 6.63636364, 6.72727273, 6.81818182,
6.90909091, 7. , 7.09090909, 7.18181818, 7.27272727,
7.36363636, 7.45454545, 7.54545455, 7.63636364, 7.72727273,
7.81818182, 7.90909091, 8. , 8.09090909, 8.18181818,
8.27272727, 8.36363636, 8.45454545, 8.54545455, 8.63636364,
8.72727273, 8.81818182, 8.90909091, 9. , 9.09090909,
9.18181818, 9.27272727, 9.36363636, 9.45454545, 9.54545455,
9.63636364, 9.72727273, 9.81818182, 9.90909091, 10. ])
二、访问数组的属性
shape属性,数组的格式
np.random.random((5,6)).shape
(5, 6)
size属性,数组中元素的个数
np.random.random((5,6)).size
30
dtype属性,数组中元素的数据类型
array_2.dtype
dtype('int64')
假如数组中有多种类型的数据元素,那么便取其中精确度最高的类型做为数组的dtype
array_4 = np.array([[1,2,3],[4.0,5,6]])
array_4.dtype
dtype('float64')
ndim属性,返回数组的维度
array_4.ndim
2
三、访问数组中的元素
访问一维数组
切片,从1到4
array_1[1:5]
array([2, 3, 4, 5])
访问单个元素
array_1[4]
5
访问二维数组
二维数组,第1行第3列
array_2[1][3]
9
效果和上面相同
array_2[1,3]
9
二维数组切片,取出第0行,第二列到第4列的元素,返回结果还是数组
array_2[:1,2:5]
array([[3, 4, 5]])
四、数组的运算
创建两个数组
a = np.random.randint(10, size=(4,5))
b = np.random.randint(10, size=(4,5))
a
array([[6, 3, 6, 1, 9],
[1, 2, 7, 8, 2],
[4, 5, 5, 5, 9],
[5, 9, 1, 6, 4]])
b
array([[0, 8, 1, 4, 7],
[0, 4, 7, 0, 3],
[7, 6, 8, 6, 8],
[7, 5, 7, 6, 5]])
加法,对应元素相加
a + b
array([[ 6, 11, 7, 5, 16],
[ 1, 6, 14, 8, 5],
[11, 11, 13, 11, 17],
[12, 14, 8, 12, 9]])
减法,对应元素相减
a - b
array([[ 6, -5, 5, -3, 2],
[ 1, -2, 0, 8, -1],
[-3, -1, -3, -1, 1],
[-2, 4, -6, 0, -1]])
*乘,对应元素相乘
a * b
array([[ 0, 24, 6, 4, 63],
[ 0, 8, 49, 0, 6],
[28, 30, 40, 30, 72],
[35, 45, 7, 36, 20]])
除法,对应元素相除
a / b
/Users/wx/Documents/learning_recode/learning/code/python/06-data_science/env/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in true_divide
"""Entry point for launching an IPython kernel.
array([[ inf, 0.375 , 6. , 0.25 , 1.28571429],
[ inf, 0.5 , 1. , inf, 0.66666667],
[0.57142857, 0.83333333, 0.625 , 0.83333333, 1.125 ],
[0.71428571, 1.8 , 0.14285714, 1. , 0.8 ]])
判断数组中是否有元素等于某个值
a == 8
array([[False, False, False, False, False],
[False, False, False, True, False],
[False, False, False, False, False],
[False, False, False, False, False]])
数组元素平方操作
a**2
array([[36, 9, 36, 1, 81],
[ 1, 4, 49, 64, 4],
[16, 25, 25, 25, 81],
[25, 81, 1, 36, 16]])
数组点乘
c = np.random.randint(10, size=(5,4))
np.dot(a,c)
array([[ 92, 100, 57, 105],
[104, 121, 87, 114],
[106, 108, 72, 129],
[105, 94, 55, 153]])
a.dot(c)
array([[ 92, 100, 57, 105],
[104, 121, 87, 114],
[106, 108, 72, 129],
[105, 94, 55, 153]])
五、array 常用函数
a
array([[6, 3, 6, 1, 9],
[1, 2, 7, 8, 2],
[4, 5, 5, 5, 9],
[5, 9, 1, 6, 4]])
sum 对数组的列求和,axis=0表示列
a.sum(axis=0)
array([16, 19, 19, 20, 24])
sum 对数组的列求和,axis=1表示行
a.sum(axis=1)
array([25, 20, 28, 25])
数组转置
a.T
array([[6, 1, 4, 5],
[3, 2, 5, 9],
[6, 7, 5, 1],
[1, 8, 5, 6],
[9, 2, 9, 4]])
将数组变换为一维形式
a.ravel()
array([6, 3, 6, 1, 9, 1, 2, 7, 8, 2, 4, 5, 5, 5, 9, 5, 9, 1, 6, 4])
使用 reshape 方法来将创建的一维数组重塑为多维数组
a.reshape(5,4)
array([[6, 3, 6, 1],
[9, 1, 2, 7],
[8, 2, 4, 5],
[5, 5, 9, 5],
[9, 1, 6, 4]])
还可以只指定reshape的行,而列自动计算
a.reshape(4,-1)
array([[6, 3, 6, 1, 9],
[1, 2, 7, 8, 2],
[4, 5, 5, 5, 9],
[5, 9, 1, 6, 4]])
求数组的最大元素的角标
a.argmax(axis=1)
array([4, 3, 4, 1])
六、numpy中的常用函数
首先创建对应的数组
a = np.random.random((5,6))*10
a
array([[4.02328882, 3.69998358, 9.2737976 , 6.29746809, 7.02947323,
7.93001415],
[4.48590584, 7.08672183, 3.93131144, 6.3209545 , 7.63438103,
2.29882062],
[0.69189349, 2.19991943, 0.85033397, 5.08617205, 2.72773218,
2.75640315],
[1.31652461, 7.67284754, 0.69005903, 4.61865465, 5.62247565,
8.77807969],
[9.65790954, 6.65482521, 6.0680172 , 7.95164155, 9.01082267,
5.09428131]])
- np.floor:对数组中的元素进行向下取整
np.floor(a)
array([[4., 3., 9., 6., 7., 7.],
[4., 7., 3., 6., 7., 2.],
[0., 2., 0., 5., 2., 2.],
[1., 7., 0., 4., 5., 8.],
[9., 6., 6., 7., 9., 5.]])
- np.exp:对数组中的元素做exp运算
np.exp(a)
array([[5.58845982e+01, 4.04466404e+01, 1.06551391e+04, 5.43194845e+02,
1.12943550e+03, 2.77946613e+03],
[8.87573145e+01, 1.19598073e+03, 5.09737829e+01, 5.56103541e+02,
2.06809057e+03, 9.96242605e+00],
[1.99749419e+00, 9.02428637e+00, 2.34042834e+00, 1.61769430e+02,
1.52981541e+01, 1.57431153e+01],
[3.73043411e+00, 2.14919266e+03, 1.99383322e+00, 1.01357579e+02,
2.76573235e+02, 6.49040161e+03],
[1.56450452e+04, 7.76522183e+02, 4.31823611e+02, 2.84023351e+03,
8.19125719e+03, 1.63086594e+02]])
- np.sqrt:对数组中的元素做求根操作
np.sqrt(a)
array([[2.00581375, 1.92353414, 3.04529105, 2.50947566, 2.65131538,
2.81602808],
[2.11799571, 2.66208975, 1.9827535 , 2.51415085, 2.76303837,
1.51618621],
[0.83180135, 1.48321254, 0.92213555, 2.25525432, 1.65158475,
1.66024189],
[1.14739906, 2.76999053, 0.83069792, 2.14910555, 2.37117601,
2.96278242],
[3.10771774, 2.57969479, 2.46333457, 2.81986552, 3.00180324,
2.25705146]])
- np.sin:对数组元素做sin运算
np.sin(a)
array([[-0.77181848, -0.52982222, 0.15040741, 0.01428229, 0.67891798,
0.99711092],
[-0.97446214, 0.71981552, -0.71015531, 0.03776021, 0.97598453,
0.74649049],
[ 0.63799639, 0.80854382, 0.75150078, -0.93095266, 0.40214687,
0.37573476],
[ 0.96784675, 0.98364002, 0.63658271, -0.99561015, -0.61367732,
0.60255466],
[-0.23102552, 0.36314387, -0.21351167, 0.99523506, 0.40223368,
-0.92796107]])
接下来是一些简单的数组拼接切割操作
a = np.floor(np.random.random((5,6))*10)
b = np.floor(np.random.random((5,6))*10)
a
array([[7., 4., 0., 5., 0., 7.],
[8., 7., 3., 5., 3., 9.],
[4., 6., 4., 9., 9., 0.],
[3., 0., 4., 0., 9., 0.],
[2., 3., 7., 5., 3., 8.]])
b
array([[8., 7., 1., 5., 1., 1.],
[3., 5., 8., 4., 1., 9.],
[4., 3., 5., 3., 4., 4.],
[6., 1., 6., 0., 3., 7.],
[1., 5., 5., 5., 4., 4.]])
- np.hstack:数组拼接(横向)
np.hstack((a,b))
array([[7., 4., 0., 5., 0., 7., 8., 7., 1., 5., 1., 1.],
[8., 7., 3., 5., 3., 9., 3., 5., 8., 4., 1., 9.],
[4., 6., 4., 9., 9., 0., 4., 3., 5., 3., 4., 4.],
[3., 0., 4., 0., 9., 0., 6., 1., 6., 0., 3., 7.],
[2., 3., 7., 5., 3., 8., 1., 5., 5., 5., 4., 4.]])
- np.vstack:数组拼接(纵向)
np.vstack((a,b))
array([[7., 4., 0., 5., 0., 7.],
[8., 7., 3., 5., 3., 9.],
[4., 6., 4., 9., 9., 0.],
[3., 0., 4., 0., 9., 0.],
[2., 3., 7., 5., 3., 8.],
[8., 7., 1., 5., 1., 1.],
[3., 5., 8., 4., 1., 9.],
[4., 3., 5., 3., 4., 4.],
[6., 1., 6., 0., 3., 7.],
[1., 5., 5., 5., 4., 4.]])
- np.hsplit:数组分割,按行,3表示分为几份
np.hsplit(a,3)
[array([[7., 4.],
[8., 7.],
[4., 6.],
[3., 0.],
[2., 3.]]), array([[0., 5.],
[3., 5.],
[4., 9.],
[4., 0.],
[7., 5.]]), array([[0., 7.],
[3., 9.],
[9., 0.],
[9., 0.],
[3., 8.]])]
- np.hsplit:数组分割,按行,(3,4)表示切分位置
np.hsplit(a,(3,4))
[array([[7., 4., 0.],
[8., 7., 3.],
[4., 6., 4.],
[3., 0., 4.],
[2., 3., 7.]]), array([[5.],
[5.],
[9.],
[0.],
[5.]]), array([[0., 7.],
[3., 9.],
[9., 0.],
[9., 0.],
[3., 8.]])]
- np.vsplit:数组分割,按列,3表示分为几份
c = np.floor(np.random.random((6,6))*10)
np.vsplit(c,2)
[array([[1., 3., 0., 1., 6., 5.],
[3., 9., 4., 3., 5., 1.],
[1., 9., 7., 8., 8., 5.]]), array([[7., 6., 1., 6., 3., 7.],
[0., 6., 7., 5., 8., 3.],
[8., 0., 3., 5., 3., 5.]])]
- np.tile:将一个数组进行扩展,可扩展为指定格式
a = np.array([1,2,3])
np.tile(a, (3,5))
array([[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]])
- np.sort:对数组内的元素进行排序
np.sort(b, axis=0)
array([[1., 1., 1., 0., 1., 1.],
[3., 3., 5., 3., 1., 4.],
[4., 5., 5., 4., 3., 4.],
[6., 5., 6., 5., 4., 7.],
[8., 7., 8., 5., 4., 9.]])
- np.argsort:获得数组值从小到大的索引
np.argsort(a)
array([[0, 1, 2],
[0, 1, 2],
[0, 1, 2]])
七、数组的复制
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
1.简单复制,引用传递
b = a
b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b.shape = (1,9)
b
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
a
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
id(a)
4493390352
id(b)
4493390352
2.view方法浅拷贝,创建了新的对象,但共用值
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = a.view()
b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
id(a)
4493391952
id(b)
4493392272
b.shape = (1,9)
b
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b[:,5] = 10
b
array([[ 1, 2, 3, 4, 5, 10, 7, 8, 9]])
a
array([[ 1, 2, 3],
[ 4, 5, 10],
[ 7, 8, 9]])
3.copy:深拷贝,创建新的对象,完全复制值
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = a.copy()
b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
id(a)
4493393552
id(b)
4493627760
b.shape = (1,9)
b
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b[:,5] = 10
b
array([[ 1, 2, 3, 4, 5, 10, 7, 8, 9]])
a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])