numpy学习笔记
一、创建数组
1.导入numpy
import numpy as np
2.通过列表创造数组
np.array([1, 2, 3]) # 一维
np.array([(1,2,3),(4,5,6)]) # 二维
3.创建特殊数组
np.zeros((3, 4)) # 创建3*4的全0数组
np.ones((2, 3, 4)) # 创建2*3*4的全1数组
np.full((3, 4), 2) # 创建全填充2的3*4数组
4.创建等差数组
np.arange(5) #创建0~4的一维等差数组
np.arange(6).reshape(2, 3) # 创建0~5的2*3数组
np.arange(10, 20, 2) # 开头是10,结尾是18,步长为2
np.linspace(3,6,3).reshape(3,1) # 开头是3,结尾是6(包含6),数字总个数
5.创建随机数组
np.random.rand(2, 3) # 创建2*3的二维随机数组
np.random.randint(1,5, size = (2, 3)) # 创建1~4,大小为2*3的随机整数数组
a = np.random.randint(1, 5, 10) # 创建1~4的10个整数
6.数组的形状与大小
# 输出数组的大小
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape) # (2, 3)
# 输出数组元素的总个数
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.size) # 6
# 改变原有数组的大小
a = np.array([[1, 2, 3], [4, 5, 6]])
a.shape = (3, 2)
print(a) # [[1 2][3 4][5 6]]
# 在副本上改变数组大小
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape(3, 2)
print(b) # a 没变
# 输出数组的维数
a = np.arange(24)
>>> a.ndim # 1
# 现在调整其大小
b = a.reshape(2, 4, 3)
>>> b.ndim # 3
7.数组合并
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.concatenate((a, b), axis=0)) #上下合并
print(np.concatenate((a, b), axis=1)) #水平合并
二、数组索引
1.单个元素的索引
# 一维
x = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x[2] # 2
>>> x[-2] # 8
# 多维
>>> x.shape = (2,5) # 现在 x 是一个二维数组
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
>>> x[1,3] # 数组 x 的 第1行 第3列 对应的元素
8
>>> x[1,-1] # 数组 x 的 第1行 最后1列 对应的元素
9
>>> x[0] #索引索引比维度少的多维数组,则会获得一个子维数组
array([0, 1, 2, 3, 4])
2.数组切片
>>> x = np.arange(10)
>>> x[2:5] # 索引以2开始,以5结束(不包含5)
array([2, 3, 4])
>>> x[:-7] # 索引以0开始,到倒数第7
array([0, 1, 2])
>>> x[1:7:2] # 索引以1开始,以7结束(不包含7),步长为2
array([1, 3, 5])
>>> y = np.arange(35).reshape(5,7)
>>> y[1:5:2,::3]
# 逗号前是数组第一维的索引,逗号后是数组第二维的索引
# 1:5:2 起始索引为 1,结束索引为5(不包含5对),步长为2
# [::3] 代表第二维索引的步长为3
array([[ 7, 10, 13],
[21, 24, 27]])
3. 索引数组
# 获取数组中的多个值
x = np.arange(10,1,-1) # 此次 -1 指步长为-1,即倒序
# [10, 9, 8, 7, 6, 5, 4, 3, 2]
x[[3, 3, 1, 8]] # 对数组 x 的第4、4、2、9个元素进行索引
# [7, 7, 9, 2]
x[[3,3,-3,8]] # 对数组 x 的第4、4、倒数第3、9个元素进行索引
# [7, 7, 4, 2]
# 获取数组中 (0,0),(1,1) 和 (2,0) 位置处的元素
x = np.array([[1, 2], [3, 4], [5, 6]])
x[[0,1,2], [0,1,0]]
# [1, 4, 5]
4. 布尔索引数组
y = np.arange(35).reshape(5,7)
y[y > 20] # 取y中值大于20的元素
y[(y > 5) & (y < 10)] # 取y中大于5小于10的元素
# 过滤空值
a = np.array([np.nan, 1,2,np.nan,3,4,5])
print (a[~np.isnan(a)]) # [1. 2. 3. 4. 5.]
三、基础数学
1.三角函数
a = np.array([0,30,45,60,90])
# 通过乘 pi/180 转化为弧度
print (np.sin(a/180*np.pi)) # 正弦
print (np.cos(a/180*np.pi)) # 余弦
print (np.tan(a/180*np.pi)) # 正切
2.加减乘除幂运算
需要有相同形状或者符合广播机制
import numpy as np
a = np.arange(9).reshape(3,3)
b = np.array([10,10,10])
print (a+b) # a+b
print (a-b) # a-b
print (a*b) # a*b
print (a/b) # a/b
print (a**b) # a**b
3.统计函数
# 最大最小值
a = np.array([[3,7,5],[8,4,3],[2,4,9]])
print (np.min(a,1)) # 沿轴1的最小值, [3,3,2]
print (np.min(a,0)) # 沿轴0的最小值, [2,4,3]
print (np.max(a)) # 所有数中的最大值,9
print (np.max(a, axis = 0)) # 沿轴0的最大值,[8,7,9]
# 求和
a = np.array([[3,7,5],[8,4,3],[2,4,9]])
print (np.sum(a,1)) # 沿轴1的和, [15 15 15]
print (np.sum(a,0)) # 沿轴0的和, [15 15 15]
print (np.sum(a)) # 所有数中的和,45
# 中位数
a = np.array([[30,65,70],[80,95,10],[50,90,60]])
print (np.median(a)) # 所有数的中位数
print (np.median(a, axis = 0)) # 沿轴0的中位数
print (np.median(a, axis = 1)) # 沿轴1的中位数
# 平均值
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (np.mean(a)) # 所有数的平均数
print (np.mean(a, axis = 0)) # 沿轴0的平均数
print (np.mean(a, axis = 1)) # 沿轴1的平均数
# 标准差与方差
std = sqrt(mean((x - x.mean())**2)) # 标准差公式
print (np.std([1,2,3,4])) # 标准差
print (np.var([1,2,3,4])) # 方差
四、排序
# 按值排序
a = np.array([[3,7],[9,1]])
print (np.sort(a)) # 沿最后的轴排序 [[3 7] [1 9]]
print (np.sort(a, axis = 0)) # 沿轴0排序 [[3 1] [9 7]]
# 返回数组值从小到大的索引值
x = np.array([3, 1, 2])
y = np.argsort(x) # [1, 2, 0]
五、线性代数
1.转置
a = np.arange(12).reshape(3,4)
print (a.T)
2.矩阵库
# 导入矩阵库
import numpy.matlib
# 创建矩阵
np.matlib.empty((2,2)) # 创建2*2的空矩阵
np.matlib.zeros((2,2)) # 创建2*2的零矩阵
np.matlib.ones((2,2)) # 创建2*2的以1填充的矩阵
np.matlib.eye(n = 3, M = 4, k = 0) # 创建一个3*4,索引开头为0,对角线元素为1的矩阵
np.matlib.identity(5) # 创建5*5的单位矩阵
np.matlib.rand(3,3) # 创建3*3的随机数矩阵
# 矩阵与array互相转换
j = np.asarray(i) # 矩阵转array
k = np.asmatrix (j) # array转矩阵
3.线性代数运算
# 计算二维数组的矩阵乘积
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
# [[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]]
print(np.dot(a,b)) # [[37 40] [85 92]]
# 计算点积
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
# 1*11 + 2*12 + 3*13 + 4*14 = 130
print (np.vdot(a,b)) # 130
# 计算行列式
b = np.array([[6,1,1], [4, -2, 5], [2,8,7]])
# 6*(-2*7 - 5*8) - 1*(4*7 - 5*2) + 1*(4*8 - -2*2)
print (np.linalg.det(b)) # -306.0
# 求逆矩阵
x = np.array([[1,2],[3,4]])
y = np.linalg.inv(x)
print(y)
# [[-2. , 1. ],[ 1.5, -0.5]]