Loading

Numpy基本操作

1. 数组创建

numpy中所有的计算都是围绕着数组进行的,因此在运算之前,我们需要将计算的数据表示成数组的形式。

  • 我们可以用np.array()来创建一个数组:

    np.array([1, 2, 3, 4, 5])
    # array([1, 2, 3, 4, 5])
    
  • np.zeros()创建一个全为零的数组:

    np.zeros((2, 3))  # 参数为元组,表示2行3列
    
    # array([[0., 0.],
    #        [0., 0.],
    #        [0., 0.]])
    
  • 类似地,可以使用np.ones()创建一个全为1的数组:

    np.ones((2, 4))
    
    # array([[1., 1., 1., 1.],
    #        [1., 1., 1., 1.]])
    
  • 使用np.arange()创建一个递增或递减的数列,类似于python的range()。

    np.arange(3, 7)  # [3, 7)
    # array([3, 4, 5, 6])
    np.arange(3, 10, 2)
    # array([3, 5, 7, 9])
    np.arange(10, 2, -3)
    #array([10,  7,  4])
    
  • np.linspace()会返回介于某个区间等间距分布的数,前两个参数是区间的范围,第三个参数是输出样本的总数:

    # 返回一个0-1范围内等间距分布的5个数
    np.linspace(0, 1, 5)
    # array([0.  , 0.25, 0.5 , 0.75, 1.  ])
    
  • 通过np.random.rand()生成随机的数组(数字范围0-1):

    np.random.rand(2, 4)
    # array([[0.90823579, 0.13280413, 0.48167232, 0.47886157],
    #        [0.73089321, 0.39703329, 0.09461766, 0.5481924 ]])
    
  • 在numpy中,数组默认的数据类型是64位的浮点数:

    a = np.zeros((2, 4))
    a.dtype
    # dtype('float64')
    
  • 可以在创建数组时,通过dtype指定其他的数据类型:

    a = np.zeros((2, 4), dtype=np.int32)
    a.dtype
    # dtype('int32')
    

    也可以通过araay.astype()来转换数据类型:

    b = a.astype(int)
    b
    # array([[0, 0, 0, 0],
    #        [0, 0, 0, 0]])
    

2. 基本运算

在numpy中我们可以轻松地对数组进行常见的数学运算。

  • 两个相同尺寸的数组可以直接进行四则运算,它会将数组同位置的元素进行加减乘除:

    a = np.array([1, 2, 3])
    b = np.array([4, 5, 6])
    a + b
    # array([5, 7, 9])
    a / b
    # array([0.25, 0.4 , 0.5 ])
    
  • 在乘法运算中还有一个点乘np.dot(),这个函数会对两个向量进行点乘运算:

    np.dot(a, b)
    # 32
    
  • 与之类似的还有矩阵乘法np.matmul()

    a = np.array([[1, 2],
                  [3, 4]])
    b = np.array([[2, 0],
                  [0, 2]])
    np.matmul(a, b)
    a @ b
    # array([[2, 4],
    #        [6, 8]])
    
  • 以下函数对数组中所有数依次运算:

    函数 说明
    np.sqrt() 开方
    np.sin(), np.cos(), np.tan() 三角函数运算
    np.log() 自然对数
    np.power() 指数
  • 广播:

    a = np.array([1, 2, 3])
    a * 5
    # array([5, 10, 15])
    

    不同维度的数组也可以进行直接运算

    a = np.array([[1],
                  [10],
                  [20]])
    b = np.array([0, 1, 2])
    a + b
    # array([[ 1,  2,  3],
    #        [10, 11, 12],
    #        [20, 21, 22]])
    

    在运算之前,numpy会将这两个数组扩展至相同的尺寸,然后再将相同位置的元素相加

    222

  • 常用函数:

    函数 说明
    min(), max() 最小值,最大值
    argmin(), argmax() 最小值,最大值的索引
    sum() 求所有数据的总和
    mean() 平均值
    median() 中位数
    var() 方差
    std() 标准差

    对于上面的函数,如果数组为多维数组,可以通过指定axis来指定维度:

    axis=0时,会将每一行中对应的数据相加,axis=0代表第一个维度,也就是行

    image-20210323091551739

    a = np.array([[1, 2, 3, 4, 5],
                  [5, 6, 7, 8, 9]])
    a.sum()  # 所有元素的和
    # 50
    a.sum(axis=0)  # 每行对应数据相加,也就是按列求和
    # array([ 6,  8, 10, 12, 14])
    

    以此类推,axis=1时代表第二个维度,也就是列

    image-20210323091742759

    a.sum(axis=1)  # 每列对应数据相加,也就是按行求和
    # array([15, 35])
    
  • 获取元素

    获取元素和python中list用法基本一致

    a = np.array([[1, 2, 3],
                  [4, 5, 6]])
    # 获取第1行第2列的值
    a[0, 1]  # a[0][1]同样
    # 2
    

    同样支持切片

    # 获取第一行[0,2)列的数据
    a[0, 0:2]  # a[0][0:2]
    # array([1, 2])
    
    # 获取第一行数据
    a[0, :]  # a[0][:]
    a[0]
    # array([1, 2, 3])
    
    # 获取第一行数据,间距为2
    a[0, ::2]
    # array([1, 3])
    
    # 获取第一行数据,倒序,间距为2
    a[0, ::-2]
    # 等同于
    a[0, -1:-4:-2]  # 倒数第一个到倒数第四个(不包括),间距为2
    # array([3, 1])
    
    a[0, 3:0:-2]  # 从3到0(不包括0),跨度为2
    # array([3])
    
  • 条件筛选指定元素

    a = np.arange(10)
    a
    # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    a < 2
    # array([ True,  True, False, False, False, False, False, False, False,
    #        False])
    
    a[a < 2]
    # array([0, 1])
    

    还可以通过逻辑运算符组合不同的条件,需要注意的是,与运算使用“&”,或运算使用“|”

    a[(a > 3) & (a % 2 == 0)]
    # array([4, 6, 8])
    
    a[(a < 5) | (a % 2 == 0)]
    # array([0, 1, 2, 3, 4, 6, 8])
    

    不能使用类似2 < a < 5这种条件筛选

    a[(2 < a < 5) | (a % 2 == 0)]  # 报错
    # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    
posted @ 2021-05-02 14:50  七年i  阅读(165)  评论(0)    收藏  举报