numpy基础
numpy是数据分析中的重要的部分,numpy用C语言编写,用于矩阵计算等操作
准备工作:下载numpy -- 官网下载或pip install numpy
import numpy as np
目录
创建矩阵
-
array基础
相关代码:
#定义一个2行3列的矩阵 array = np.array([[1,2,3],[2,3,4]]) print(array) #输出array print("number of dim:",array.ndim) #array是几维 print("shape of array:",array.shape) #array的形状(几行几列) print("size of array:",array.size) #共有多少个元素
输出结果:
[[1 2 3] [2 3 4]] number of dim: 2 shape of array: (2, 3) size of array: 6
-
特殊矩阵定义
相关代码:
a = np.zeros((3,4)) #3行4列的0矩阵 b = np.ones((3,4)) #3行4列的矩阵,矩阵中的数字均为1 print(a) print(b)
输出结果:
array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) #a array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) #b
-
arange
arange函数用于创建等差数组,使用频率非常高,arange非常类似range函数,会python的人肯定经常用range函数,比如在for循环中,几乎都用到了range,两者的区别仅仅是arange返回的是一个数据,而range返回的是list
arange(n,m,s)
arange()中最少包含一个参数,最多包含3个参数
n代表起始值,m代表终止值,s代表步长()
相关代码:
c = np.arange(10,20,2) print(c) #以10开始,以20结束(不包括20),步长为2 d = np.arange(12) print(d) #以0开始,以11结束(不包含12),步长默认为1 e = np.arange(2,8) print(e) #以2开始,以7结束(不包含8),步长默认为1
输出结果:
[10 12 14 16 18] #c [ 0 1 2 3 4 5 6 7 8 9 10 11] #d [2 3 4 5 6 7] #e
-
reshape函数
reshape()
数组array中的方法,作用是将数据重新组织
相关代码:
f = np.arange(12).reshape(3,4) print(f)
输出结果:
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
需要注意的是:reshape新生成数组和原数组公用一个内存,不管改变哪个都会互相影响
d = np.arange(12) f = np.arange(12).reshape(3,4)print(f) #将d中第一个数字改变为111 d[0] = 111 print(d) print(f)
输出结果:
array([111, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) array([[111, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
-
linspace
linspace(start, stop, [num=50, endpoint=True, retstep=False, dtype=None])
其中[num=50, endpoint=True, retstep=False, dtype=None]可选
在指定的间隔内返回均匀间隔的数字
返回num均匀分布的样本,在[start, stop]这个区间的端点可以任意的被排除在外
a = np.linspace(1,10,20) #以1为起始值,10为终止值(包含10),共分为20个数 --> 自动匹配步长 print(a)
输出结果:
array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ])
b = np.linspace(1,10,6).reshape(2,3) print(b)
输出结果:
array([[ 1. , 2.8, 4.6], [ 6.4, 8.2, 10. ]])
基础运算
-
加减乘运算
首先定义两个一维矩阵
a = np.array([10,20,30,40]) b = np.arange(4) print(a) print(b)
输出结果:
[10 20 30 40] [0 1 2 3]
接着进行基础运算:
#每个位置的对应元素相减 c1 = a - b #每个位置的对应元素相加 c2 = a + b #b矩阵元素平方 c3 = b ** 2 #10乘以a矩阵的每个元素取sin值 c4 = 10 * np.sin(a) #线性代数中的矩阵的乘法概念,这里为将a中的每个元素与b中对应元素相乘后相加 c_dot = np.dot(a,b) #每个元素对应相乘 c5 = a * b print(c1) print(c2) print(c3) print(c4) print(c_dot) print(c5)
输出结果:
[10 19 28 37] [10 21 32 43] [0 1 4 9] [-5.44021111 9.12945251 -9.88031624 7.4511316 ] 200 [ 0 20 60 120]
比较运算符
举例:
print(b<3)
输出结果为布尔值
[ True True True False]
同理,定义两个二维矩阵
a = np.array([[1,1], [0,1]]) b = np.arange(4).reshape(2,2) print(a) print(b)
输出结果:
array([[1, 1], [0, 1]]) array([[0, 1], [2, 3]])
相关代码:
#矩阵的乘法 c_dot = np.dot(a,b) c_dot_2 = a.dot(b) #对应元素相乘 c = a * b
输出结果:
[[2 4] [2 3]] [[2 4] [2 3]] [[0 1] [0 3]]
-
求和/平均值/最大/最小值
random(m,n)
随机生成m行n列的矩阵,矩阵中均为从0至1的随机数
sum()/ min()/max()的使用
a = np.random.random((2,4)) #a的和 np.sum(a) #a的最小值 np.min(a) #a的最大值 np.max(a) print(a) print(np.sum(a)) print(np.min(a)) print(np.max(a))
输出结果:
array([[0.42179824, 0.85771199, 0.00553504, 0.62031208], [0.17124248, 0.030651 , 0.55065275, 0.41711456]]) 3.075018148348292 0.005535040390910018 0.8577119893768688
另外,可以按照列/行求和/平均值/最大/最小值
axis
例如:
np.sum(a, axis = 1) #每一行求一个和 np.min(a, axis = 0) #每一列求一个最小值
输出结果:
array([1.90535736, 1.16966079]) array([0.17124248, 0.030651 , 0.00553504, 0.41711456])
-
其余运算
A = np.arange(2,14).reshape(3,4) print(A)
输出结果:
[[ 2 3 4 5] [ 6 7 8 9] [10 11 12 13]]
相关代码
np.argmin(A) #求最小值所在的索引 np.argmax(A) #最大值所在的索引 np.mean(A) #平均值 np.median(A) #中位数 np.cumsum(A) #累计求和 np.diff(A) #累计求差 np.nonzero(A) #非0的坐标 np.sort(A) #逐行排序 np.transpose(A) #转置 A.T #转置 np.clip(A,5,9) #将矩阵中大于9的值变为9,小于5的值变为5,其余不变
输出结果:
0 # A中的最小值为2,索引为0 (注意:索引从0开始) 11 # A中的最大值为13,索引为11 7.5 #平均数 7.5 #中位数 #累计求和 #第一个数为原始A矩阵的第一个数,第二个数为原始A矩阵第一个数加上第二个数...以此类推 array([ 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 77, 90], dtype=int32) #累计求差 #每一行的数均为后一位数减去前一位数,得到的列数会减少一列 array([[1, 1, 1], [1, 1, 1], [1, 1, 1]]) #非零的坐标 #第一个矩阵为行坐标,第二个矩阵为列坐标 #即:A[0][0],A[0][1],A[0][2]....不为0 (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)) #排序 array([[ 2, 3, 4, 5], [ 6, 7, 8, 9], [10, 11, 12, 13]]) #转置 array([[ 2, 6, 10], [ 3, 7, 11], [ 4, 8, 12], [ 5, 9, 13]]) #clip array([[5, 5, 5, 5], [6, 7, 8, 9], [9, 9, 9, 9]])
索引
A=np.arange(3,15)
print(A)
[ 3 4 5 6 7 8 9 10 11 12 13 14]
B= np.arange(3,15).reshape(3,4)
print(B)
array([[ 3, 4, 5, 6],
[ 7, 8, 9, 10],
[11, 12, 13, 14]])
B[2]
array([11, 12, 13, 14])
B[1,1]
8
B[2,:] # 冒号:表示所有数,这里表示第2行的所有数
array([11, 12, 13, 14])
B[:,1] #第一列的所有数
array([ 4, 8, 12])
B[1,1:3]
array([8, 9])
B.flatten() #转变为1行
array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
此外,可以用for循环迭代行
for row in B:
print(row)
输出结果:
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
用for循环迭代列需要用到矩阵的转置
for row in B.T: print(row)
输出结果:
[ 3 7 11] [ 4 8 12] [ 5 9 13] [ 6 10 14]
用for循环输出每一个数
for item in B.flat: #用flat将B矩阵转变为1行,依次输出每一个数 print(item)
输出结果:
3 4 5 6 7 8 9 10 11 12 13 14