本教程是numpy快速入门教程的最后一篇,在这篇文章中,我将会介绍到一些关于numpy的快捷操作以及numpy的广播。

一、获取和修改数组的值

1、根据下标获取和修改数组的值


import numpy as np

#numpy修改数组值得快捷操作
if __name__ == "__main__":
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    #创建获取数组的指定列的下标
    col_index = np.array([1,2,0])
    #根据所选的列下标数组获取数组中的元素,np.arrage(3),会产生一个[0,1,2]的数组
    result1 = a[np.arange(3),col_index]
    print(result1) #[2 6 7]
    #修改指定下标位置的元素值
    a[np.arange(3), col_index] += 6
    print(a)
    '''
    [[ 1  8  3]
     [ 4  5 12]
     [13  8  9]]
    '''

2、根据一个bool类型的数组来获取数组的值


'''
    通过一个boolean类型的数组来选择数组中的元素
    '''
    d = np.array([[5,1,3,4],[6,8,9,1],[10,4,2,1]])
    #选出数组中大于3的元素
    bool_con = d > 3
    #获取满足条件的元素
    d_con = d[bool_con]
    print(d_con)       #[ 5  4  6  8  9 10  4]
    print(d[d > 3])    #[ 5  4  6  8  9 10  4]

二、numpy的数据类型


import numpy as np

if __name__ == "__main__":
    '''
    numpy提供了许多的数据类型,在创建数组没有指定数据类型,numpy会提供了一个默认的数据类型
    '''
    a = np.array([1,2,3])
    print(a.dtype)   #int32
    b = np.array([1.1,2.0,3.0])
    print(a.dtype)    #int32
    c = np.array([1,2,3],dtype=np.int64)
    print(c.dtype)    #int64

三、numpy数组的基本操作

1、数组之间的加、减、乘、除


import numpy as np

if __name__ == "__main__":
    #创建两个数组,指定数组的数据类型为float32
    x = np.array([[1,2],[3,4]],dtype=np.float32)
    y = np.array([[5,6],[7,8]],dtype=np.float32)
    #数组之间的加法
    add1 = x + y
    add2 = np.add(x,y)
    print(add1)
    '''
    [[  6.  8.]
    [ 10.  12.]]
    '''
    print(add2)
    '''
    [[  6.  8.]
    [ 10.  12.]]
    '''
    #数组之间的减法
    subxy1 = x - y
    subxy2 = np.subtract(x,y)
    print(subxy1)
    '''
    [[-4. -4.]
    [-4. -4.]]
    '''
    print(subxy2)
    '''
    [[-4. -4.]
    [-4. -4.]]
    '''
    #数组之间的乘法
    mulxy1 = x * y
    mulxy2 = np.multiply(x,y)
    print(mulxy1)
    '''
    [[  5.  12.]
    [ 21.  32.]]
    '''
    print(mulxy2)
    '''
    [[  5.  12.]
    [ 21.  32.]]
    '''
    #数组之间的除法
    divxy1 = x/y
    divxy2 = np.divide(x,y)
    print(divxy1)
    '''
    [[ 0.2        0.33333334]
    [ 0.42857143  0.5      ]]
    '''
    print(divxy2)
    '''
    [[ 0.2        0.33333334]
    [ 0.42857143  0.5      ]]
    '''
    #求数组的平方根
    sqrtx = np.sqrt(x)
    print(sqrtx)
    '''
    [[ 1.          1.41421354]
    [ 1.73205078  2.        ]]
    '''

2、数组之间的点乘



#数组之间的点乘,注意左乘和右乘的区别,注意两个数组点乘的条件是前一个矩阵的列等于后一个矩阵的行
    # 创建两个数组,指定数组的数据类型为float32
    x = np.array([[1, 2], [3, 4]], dtype=np.float32)
    y = np.array([[5, 6], [7, 8]], dtype=np.float32)
    dotxy1 = np.dot(x,y)  #等价于x.dot(y)
    print(dotxy1)
    '''
    [[ 19.  22.]
    [ 43.  50.]]
    计算过程
    19 = 1*5 + 2*7
    22 = 1*6 + 2*8
    43 = 3*5 + 4*7
    50 = 3*6 + 4*8
    '''
    dotxy2 = np.dot(y,x) #等价于y.dot(x)
    print(dotxy2)
    '''
    [[ 23.  34.]
    [ 31.  46.]]
    计算过程
    23 = 5*1 + 6*3
    34 = 5*2 + 6*4
    31 = 7*1 + 8*3
    46 = 7*2 + 8*4
    '''

3、数组求和


#数组求和函数
    x = np.array([[1, 2], [3, 4]], dtype=np.float32)
    #求所有数组元素的和
    sum1 = np.sum(x)
    print(sum1)  #10.0
    #求数组相同列之间元素的和
    sum2 = np.sum(x,axis=0)
    print(sum2)  #[ 4.  6.]
    #求数组相同行之间元素的和
    sum3 = np.sum(x,axis=1)
    print(sum3)  #[ 3.  7.]

4、矩阵的转置



#求矩阵的转置,将矩阵的行变成列,列变成行
    x = np.array([[1, 2], [3, 4]], dtype=np.float32)
    print(x)
    '''
    [[ 1.  2.]
    [ 3.  4.]]
    '''
    transposition_x = x.T
    '''
    [[ 1.  3.]
    [ 2.  4.]]
    '''
    print(transposition_x)

四、数组的广播



import numpy as np

#广播
'''
广播是numpy提供的一个非常重要的技巧对于操作不同大小的矩阵
1、如果两个数组的阶不相同,将低阶的数组大小转换成与高阶的大小相同
2、如果两个数组的维度相同或者其中一个数组的维度为1
3、数组在所有的维度上都可以进行广播
4、经过广播之后的两个数组,数组的大小等于维度最大的那个
5、如果一个数组的维度为1,而另一个数组的维度是任意的,那么这个维度为1的数组,会复制自己的元素达到与另一个数组拥有相同的维度
'''
if __name__ == "__main__":
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    v = np.array([1,0,1])
    #给矩阵a的每一行都加上v,在执行下面代码的时候,numpy会自动调用广播
    #将矩阵v先扩展成为[[1,0,1],[1,0,1],[1,0,1]]然后再与矩阵a做加法
    b = a +v
    print(b)
    '''
    [[ 2  2  4]
    [ 5  5  7]
    [ 8  8 10]]
    '''
    v1 = np.array([2])
    b1 = a + v1
    print(b1)
    '''
    [[ 3  4  5]
    [ 6  7  8]
    [ 9 10 11]]
    '''
    #并不是所有的不同维度数组之间的操作都可以使用广播
    v2 = np.array([1,2])
    b2 = a + v2
    #ValueError: operands could not be broadcast together with shapes (3,3) (2,)
    print(b2)