numpy
numpy基本概念
numpy 是快速、方便的科学计算基础库(主要是对数值的计算,多维数组的运算)。Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵。
●轴的理解(axis):0轴, 1轴, 2轴
一维数组:[1,2,3,4,5] ----> 0轴
二维数组:[[1,2,3,4,5], [1,2,3,4,5]] ----> 0轴,1轴
三维数组:[[[1,2],[3,4],[5,6]], [[1,2],[3,4],[5,6]]] ----> 0轴,1轴,2轴
创建数组
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.arange(10,20,2)
c = np.arange(12).reshape((3,4))
d = np.linspace(1,10,20)
e = np.linspace(1,10,6).reshape(2,3)
基本操作
【加减】
import numpy as np
a = np.array([10,20,30,40])
b = np.arange(4)
print(a,b)
c = a-b
d = a+b
print(c)
print(d)
*************************************************
[10 20 30 40] [0 1 2 3]
[10 19 28 37]
[10 21 32 43]
【乘,矩阵相乘】
a = np.array([[1,1],
[0,1]])
b = np.arange(4).reshape(2,2)
c = a*b #矩阵相乘,对应位置相乘
c_dot = np.dot(a,b) #矩阵的乘法
print(c)
print(c_dot)
c_dot_2 = a.dot(b)
print(c_dot_2) #矩阵相乘的另一种写法
********************************************************
[[0 1]
[0 3]]
[[2 4]
[2 3]]
[[2 4]
[2 3]]
【求和,最大最小值】
a = np.random.random((2,4)) #随机生成一个矩阵
print(a)
print(np.sum(a)) #所有数相加的和
print(np.min(a)) #最小值
print(np.max(a)) #最大值
print(np.sum(a,axis=1)) #axis=1每一行的和,axis=0每一列中的和
print(np.max(a,axis=0)) #每一列中的最大值
*************************************************************
[[0.18748309 0.21511821 0.94821479 0.86264897]
[0.61484458 0.96195364 0.32977898 0.57563758]]
4.695679836849307
0.18748309295018062
0.9619536361252737
[2.21346506 2.48221478]
[0.61484458 0.96195364 0.94821479 0.86264897]
【其他基本操作】
a = np.arange(2,14).reshape((3,4))
print(a)
print(np.argmin(a)) #打印出最小值的索引
print(np.argmax(a)) #打印出最大值的索引
print(np.mean(a)) #打印出平均值
print(np.median(a)) #打印出中位数
print(np.cumsum(a)) #打印出累加和
print(np.diff(a)) #打印出相邻两个数的差值
print(np.sort(a)) #逐行排序,从小到大
print(np.transpose(a)) #转置矩阵
print(a.T) #转置矩阵
print((a.T).dot(a))
print(np.clip(a,5,9)) #把矩阵内小于5的数变为5,大于9的数变为9
*******************************************************************
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
0
11
7.5
7.5
[ 2 5 9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
[1 1 1]
[1 1 1]]
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
[[140 158 176 194]
[158 179 200 221]
[176 200 224 248]
[194 221 248 275]]
[[5 5 5 5]
[6 7 8 9]
[9 9 9 9]]
索引和切片
ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
【索引】
a = np.arange(3,15).reshape((3,4))
print(a)
print(a[2])
print(a[1][2])
print(a[1,2])
print(a[:,:]) #索引访问
print(a[1,:])
print(a[1,1:3])
for row in a:
print(row) #打印出每一行的数
for column in a.T:
print(column) #打印出每一列的数
print(a.flatten())
for item in a.flat:
print(item) #返回所有的数
****************************************************************
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[11 12 13 14]
9
9
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[ 7 8 9 10]
[8 9]
#每一行
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
#每一列
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
#所有数
[ 3 4 5 6 7 8 9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14
【切片】
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
import numpy as np
a = np.arange(10)
s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])
*********************************************************
[2 4 6]
也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作:
import numpy as np
a = np.arange(10)
b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2
print(b)
拼接、合并与分割
【拼接】
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b)) #vertical stack 上下合并
d = np.hstack((a,b)) #horizontal stack 左右合并
print(c)
print(d)
*************************************************************
[[1 1 1]
[2 2 2]]
[1 1 1 2 2 2]
【维度变化】
a = np.array([1,1,1])
b = np.array([2,2,2])
print(a[np.newaxis,:]) #在行里加了一个维度
print(a[np.newaxis,:].shape)
print(a[:,np.newaxis]) #在列里加了一个维度
**********************************************************
[[1 1 1]]
(1, 3)
[[1]
[1]
[1]]
【合并】
a = np.array([1,1,1])[:,np.newaxis]
b = np.array([2,2,2])[:,np.newaxis]
print(np.hstack((a,a,b,b)))
c = np.concatenate((a,b,b,a),axis=1) #指定上下合并
print(c)
************************************************************
[[1 1 2 2]
[1 1 2 2]
[1 1 2 2]]
[[1 2 2 1]
[1 2 2 1]
[1 2 2 1]]
【分割】
a = np.arange(12).reshape((3,4))
print(a)
print(np.split(a,3,axis=0))
print(np.array_split(a,3,axis=1)) #不等分割
print(np.vsplit(a,3)) #纵向分割
print(np.hsplit(a,2)) #横向分割
***********************************************************
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
浅复制和深复制
【浅复制】
a = np.array([10,20,30,40])
b = a
c = a
d = b
a[1] = 22
print(b)
print(d)
a is b
*****************************************
[10 22 30 40]
[10 22 30 40]
True
【深复制】
b = a.copy() #deep copy
print(b)
a[3] = 55
print(a)
print(b)
a is b
********************************************************
[10 22 30 55]
[10 22 30 55]
[10 22 30 55]
False