目录
3.基本操作(Basic operations of Matrix)
5.合并与拆分(merging and splitting)
around() 近似取整、floor() 向下取整、ceil 向上取整
1.Numpy简介
机器学习模型:
在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
图像处理与计算机图形学:
计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
数学任务:
NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
2.数组创建(Create an array)
import numpy as np
a = np.array([2,3,4],dtype=np.int32)
##一维数组的创建,同时制定数据类型
#array([2, 3, 4])
a = np.array([[1,2,3],[2,3,4]])
#多维数组的创建
#array([[1, 2, 3],
# [2, 3, 4]])
a = np.zeros((2,4))
##全零数组的创建
#array([[0., 0., 0., 0.],
# [0., 0., 0., 0.]])
a = np.ones((3,4),dtype=np.int)
##全一数组的创建,同时制定数据类型
#array([[1, 1, 1, 1],
# [1, 1, 1, 1],
# [1, 1, 1, 1]])
a=np.arange(1,10,2)
##1-10的数据,步长为2
#array([1, 3, 5, 7, 9])
a=np.array([2,3,4],dtype=np.int32)
a.ndim
#维度 3
a.shape
#行数和列数 (3,)
a.size
#元素个数 3
3.基本操作(Basic operations of Matrix)
#创建两个一维矩阵
a=np.array([1,2,2,4])
#array([1, 2, 2, 4])
b=np.arange(4)
#array([0, 1, 2, 3])
c1=a-b
#array([1, 1, 0, 1])对应相减
c2=a*b
#array([ 0, 2, 4, 12])对应相乘
c3=a.dot(b)
#18 对应相乘再求和
c4=b**2
#array([0, 1, 4, 9], dtype=int32) #对应位置平方
c5=np.sin(a)
#array([ 0.84147098, 0.90929743, 0.90929743, -0.7568025 ]) 数学函数工具求sin
#创建2个多维矩阵
a=np.array([[1,1],[0,1]])
#array([[1, 1],
# [0, 1]])
b=np.arange(4).reshape((2,2))
#array([[0, 1],
# [2, 3]])
c1 = a.dot(b)
#array([[2, 4],
# [2, 3]]) 矩阵乘a*b
a=np.random.random((2,4))
#array([[0.68909568, 0.35636011, 0.07564195, 0.44086053],
# [0.90694468, 0.36875639, 0.17867391, 0.6763671 ]]) 创建2*4的随机数矩阵
a=np.sum(a)
#3.692700350788956 矩阵中数之和
a=np.min(a)
#3.692700350788956 矩阵中最小的值
a=np.mean(a)
#3.692700350788956 矩阵中元素的平均值
a=np.sum(a,axis=0)
#3.692700350788956 按列进行求和
a=np.sum(a,axis=1)
#报错?? 按行进行求和
#矩阵基本运算
A=np.arange(2,14).reshape(3,4)
#array([[ 2, 3, 4, 5],
[ 6, 7, 8, 9],
[10, 11, 12, 13]])创建一个3*4的矩阵2-13
np.argmin(A)
#0 最小值元素索引0
np.argmax(A)
#11 最小值元素索引11
np.mean(A)
#7.5 整个矩阵的均值
np.average(A)
#7.5 平均数
A.mean()
#7.5
np.median(A)
#7.5 中位数
np.cumsum(A)
#array([ 2, 5, 9, 14, 20, 27, 35, 44, 54, 65, 77, 90], dtype=int32)
#累加,每个位置的数是前边位置的和
np.diff(A)
#array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])累差运算
A=np.arange(14,2,-1).reshape((3,4))
#array([[14, 13, 12, 11],
# [10, 9, 8, 7],
# [ 6, 5, 4, 3]])
np.sort(A)
#array([[11, 12, 13, 14],
# [ 7, 8, 9, 10],
# [ 3, 4, 5, 6]]) 只是对每行进行递增排序
np.transpose(A)
A.T
#array([[14, 10, 6],
# [13, 9, 5],
# [12, 8, 4],
# [11, 7, 3]]) 矩阵转置
np.clip(A,5,9)
#array([[9, 9, 9, 9],
# [9, 9, 8, 7],
# [6, 5, 5, 5]]) 比5小的变为5,比9大的变为9,其余不变
4.索引和切片(Indexing and slicing)
A=np.arange(3,15)
#array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
B=A.reshape(3,4)
#array([[ 3, 4, 5, 6],
# [ 7, 8, 9, 10],
# [11, 12, 13, 14]])
B[2]
#array([11, 12, 13, 14])
B[1,1:3]
#array([8, 9]) 输出第1行的第1和2位置的元素
B[0:2,1:3]
#array([[4, 5],
# [8, 9]]) 输出第0行和第1行的第1个位置和第2个位置的元素
for row in B:
print(row)
#[3 4 5 6]
#[ 7 8 9 10]
#[11 12 13 14] 打印行
for columns in B.T:
print(columns)
#[ 3 7 11]
#[ 4 8 12]
#[ 5 9 13]
#[ 6 10 14] 打印列,多维数组编程一维
A=np.arange(3,15).reshape(3,4)
A.flatten()
#array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
5.合并与拆分(merging and splitting)
数组合并
#数组合并
A=np.array([1,1,1])
B=np.array([2,2,2])
np.vstack((A,B))
#array([[1, 1, 1],
# [2, 2, 2]]) vertical stack上下合并
np.hstack((A,B))
#array([1, 1, 1, 2, 2, 2]) 左右合并
A=np.arange(12).reshape(3,4)
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
np.hsplit(A,2)
#[array([[0, 1],
# [4, 5],
# [8, 9]]), array([[ 2, 3],
# [ 6, 7],
# [10, 11]])]
np.split(A,2,axis=1)
#[array([[0, 1],
# [4, 5],
# [8, 9]]), array([[ 2, 3],
# [ 6, 7],
# [10, 11]])]
np.vsplit(A,3)
#[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
np.split(A,3,axis=0)
#[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
b=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
#array([[ 0, 1, 20, 3, 4, 5],
# [ 6, 7, 8, 9, 10, 11]])
c=b*2
#array([[ 0, 2, 40, 6, 8, 10],
# [12, 14, 16, 18, 20, 22]])
np.dstack((b,c))
#array([[[ 0, 0], 深度合并
# [ 1, 2],
# [20, 40],
# [ 3, 6],
# [ 4, 8],
# [ 5, 10]],
# [[ 6, 12],
# [ 7, 14],
# [ 8, 16],
# [ 9, 18],
# [10, 20],
# [11, 22]]])
矩阵合并
A=np.array([1,1,1])
B=np.array([2,2,2])
A=A[:,np.newaxis]
#array([[1],
# [1],
# [1]])
B=B[:,np.newaxis]
#array([[2],
# [2],
# [2]])
C1=np.concatenate((A,B),axis=0)
#array([[1],
# [1],
# [1],
# [2],
# [2],
# [2]])
C2=np.concatenate((A,B),axis=1)
#array([[1, 2],
# [1, 2],
# [1, 2]])
6.cooy 与 =(copy and equal)
=赋值会带有关联性、copy赋值方式没有关联性
#=赋值的关联性
a=np.arange(4)
#a:array([0, 1, 2, 3])
b=a
#b:array([0, 1, 2, 3])
a[0]=11
#a:array([11, 1, 2, 3]) a中元素发生改变,b中的元素同样变化
#b:array([11, 1, 2, 3])
b[1:3]=[12,13]
#b:array([11, 12, 13, 3]) b中元素发生改变,a中元素同样变化
#a:array([11, 12, 13, 3])
#copy()赋值没有关联性
a=np.arange(4)
#array([0, 1, 2, 3])
b=a.copy()
#b:array([0, 1, 2, 3])
a[3]=44
#a:array([ 0, 1, 2, 44])
#b:array([0, 1, 2, 3])
7.广播机制(Broadcase mechanism)
当数组跟一个标量进行计算时,标量需要根据数组的形状进行扩展,然后执行运算。该扩招过程称为“广播”
a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
#array([[ 0, 0, 0],
# [10, 10, 10],
# [20, 20, 20],
# [30, 30, 30]])
b=np.array([0,1,2])
#array([0, 1, 2])
a+b
#array([[ 0, 1, 2],
# [10, 11, 12],
# [20, 21, 22],
# [30, 31, 32]]) a,b的维度不一样,在进行计算的时候会将b广播后计算
b=np.tile([0,1,2],(4,1))
#array([[0, 1, 2],
# [0, 1, 2],
# [0, 1, 2],
# [0, 1, 2]])
a+b
#array([[ 0, 1, 2],
# [10, 11, 12],
# [20, 21, 22],
# [30, 31, 32]]) b行重复4次,列重复1次
8.常用函数
bincount() 计算索引出现次数、
x=np.array([1,2,3,3,0,1,4,0])
#array([1, 2, 3, 3, 0, 1, 4, 0])
np.bincount(x)
#array([2, 2, 1, 2, 1], dtype=int64)
#索引0出现2次,索引1出现2次,索引2出现1次,索引3出现2次..
#x中最大数为4,那么bin中统计的索引只能为0-4的5个数字,统计他们在x中出现的次数
w=np.array([3,5,7,6,1,9,1,2])
np.bincount(x,weights=w)
#array([ 3., 12., 5., 13., 1.])
np.bincount(x,weights=w,minlength=7)
#array([ 3., 12., 5., 13., 1., 0., 0.])
argmax() 返回最大元素中的位置、
x=[[1,3,3],[7,5,2]]
#[[1, 3, 3], [7, 5, 2]]
np.argmax(x)
#3 返回最大元素的位置
np.argmax(x,axis=0)
#array([1, 1, 0], dtype=int64)
#按列操作返回最大元素的索引位置
np.argmax(x,axis=1)
#array([1, 0], dtype=int64)
#按行操作返回最大元素的索引位置
around() 近似取整、floor() 向下取整、ceil 向上取整
np.around([-0.6,1.2798,2.357,9.67,13],decimals=0)
#array([-1., 1., 2., 10., 13.])
np.around([-0.6,1.2798,2.357,9.67,13],decimals=1)
#array([-0.6, 1.3, 2.4, 9.7, 13. ])
np.around([-0.6,1.2798,2.357,9.67,13],decimals=2)
#array([-0.6 , 1.28, 2.36, 9.67, 13. ]) decimals指定保留有效位数
np.around([1,2,5,6,56],decimals=-1)
#array([ 0, 0, 0, 10, 60]) -1表示看最后一位数是否进位,大于5进位,小于5省去
np.around([1,2,5,6,56],decimals=-2)
#array([ 0, 0, 0, 0, 100]) -2表示看最后两位是否进位,大于50进位,小于50省去
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])
#array([-1., -2., -1., -2., 0., 1., 1.]) 向下取整
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])
#array([ 2., 2., 2., 3., 2., -0., -0., -0.]) 向上取整