Python(Ⅲ):Numpy

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24990189/article/details/89716686

目录

1.Numpy简介

2.数组创建(Create an array)

3.基本操作(Basic operations of Matrix)

4.索引和切片(Indexing and slicing)

5.合并与拆分(merging and splitting)

数组合并

矩阵合并

6.cooy 与 =(copy and equal)

7.广播机制(Broadcase mechanism)

8.常用函数

bincount() 计算索引出现次数、

argmax() 返回最大元素中的位置、

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.]) 向上取整

猜你喜欢

转载自blog.csdn.net/qq_24990189/article/details/89716686