NumPy入门案例

27 阅读4分钟

创建ndarray

import numpy as np

if __name__ == '__main__':
    data = np.array([2, 4, 6, 8])  # 一维数组
    data = np.array([[1, 3, 5],
                     [2, 4, 6]])  # 二维数组 两行三列 (2,3)
    data = np.arange(10)  # 一维数组 [0 1 2 3 4 5 6 7 8 9]
    data = np.arange(10, 20)  # 一维数组 [10 11 12 13 14 15 16 17 18 19]
    data = np.arange(10, 20, 2)  # 一维数组 [10 12 14 16 18]
    data = np.zeros((3, 4))  # 三行四列浮点数0.0
    data = np.zeros((3, 4), dtype=np.int32)  # 三行四列整型0
    data = np.ones((3, 4))  # 三行四列浮点数1.0
    data = np.full((7, 2), 'z')  # 给定初始化条目
    data = np.empty((3, 2))  # 具有给定形状和类型的新的数组,不初始化条目
    data = np.random.randint(1, 100, (3, 4))  # 三行四列整型[1,100)范围的数值
    data = np.random.rand(3, 2)  # 三行两列 浮点型 [0.0,1.0)范围的数值
    data = np.linspace(1, 10, 5)  # 一维数组  [1.0,10.0] 范围的数值平均取5个数 间隔为(10.0-1.0)/(5-1)
    # [ 1.    3.25  5.5   7.75 10.  ]
    data = np.linspace(0, 9, 4)  # 一维数组  [0.0,9.0] 范围的数值平均取4个数 间隔为(9.0-1.0)/(4-1)
    # [0. 3. 6. 9.]
    print(data)

访问

  1. 索引访问
import numpy as np

if __name__ == '__main__':
    data = np.arange(100)  # 一维数组
    print(data[35])  # 35
    print(data[8:13])  # [ 8  9 10 11 12]
    print(data[10:20:2])  # start:end:step [10 12 14 16 18]
    print(data[:13])  # [ 0  1  2  3  4  5  6  7  8  9 10 11 12]
    data = np.arange(100).reshape((10, 10))  # 二维数组
    print(data[3, 5])  # 35
    print(data[2:4, 5])  # [25 35]
    print(data[:, 5])  # [ 5 15 25 35 45 55 65 75 85 95]
    print(data[2:4, 5:9])  # [[25 26 27 28][35 36 37 38]]
    print(data[2:4, :9])  # [[20 21 22 23 24 25 26 27 28] [30 31 32 33 34 35 36 37 38]]
    print(data[3:4, 3:4])  # [[33]]
    data = np.arange(100).reshape((2, 5, 10))  # 三维数组
    print(data[1, 2, 6])  # 76
    print(data[1, :, 6])  # [56 66 76 86 96]
    # 布尔索引 长度必须相同
    a = [True, False, False, True, False]
    data = np.array([1, 2, 3, 4, 5])
    print(data[a])  # [1 4]
    # 遍历
    data = np.arange(10).reshape((2, 5))
    for e in np.nditer(data):  # 0 1 2 3 4 5 6 7 8 9
        print(e, end=" ")
    for e in np.nditer(data, order='F'):  # 0 5 1 6 2 7 3 8 4 9
        print(e, end=" ")
  1. 花式索引
import numpy as np

if __name__ == '__main__':
    data = np.arange(50, 100)  # 一维数组
    a = np.array([2, 3, 4, 5])
    print(data[a])  # [52 53 54 55]
    a = np.array([[2, 5], [6, 9]])
    print(data[a])  # [[52 55] [56 59]]
    data = np.arange(1, 10).reshape((3, 3))  # 二维数组
    a = [1, 2]
    b = [0, 1]
    print(data[a, b])  # [1,0]->4 [2,1]->8 ==>[4 8]
    a = np.array([[1, 1],
                  [2, 0]])
    b = np.array([[1, 0],
                  [2, 2]])
    print(data[a, b])  # [1,1]->5  [[5 4][9 3]]

基本运算

import numpy as np

if __name__ == '__main__':
    a = np.array([2, 4, 6, 5])
    b = np.array([1, 2, 3, 1])
    print(a + b, a - b, a * b)
    a = np.array([[8, 6],
                  [2, 0]])
    b = np.array([[1, 3],
                  [2, 2]])
    print(a + b, a - b, a * b)
    # 这里的a*b只是单纯的对应位置相乘
    # 若想要二维矩阵的相乘,可以使用@或dot函数
    c = a @ b
    d = a.dot(b)
    print(c, d)
    # 矩阵相乘要遵循:前面矩阵的列数等于后面矩阵的行数
    a = np.array([[2, 3, 4],
                  [5, 6, 0]])
    b = np.array([[1, 3],
                  [2, 2],
                  [4, 5],
                  [1, 6]])
    # print(a.dot(b)) 翻过来不行
    print(b.dot(a))
    print(f'{b.shape}@{a.shape}={(b.dot(a)).shape}') # (4, 2)@(2, 3)=(4, 3)

广播

import numpy as np

if __name__ == '__main__':
    # 广播
    a = np.array([2, 4, 6, 5])
    sum = a + 3
    # 此时的标量3会广播成 [3,3,3,3]
    sum2 = a + [3, 3, 3, 3]
    print(sum, sum2)  # [5 7 9 8] [5 7 9 8]
    # 一维数组如果只有一个数,也会像标量一样广播成相同长度再做运算
    sum3 = a + [3]
    print(sum3)

    # 二维数组的广播
    b = np.array([[8, 6],
                  [2, 0]])
    sum = b + 3
    print(sum)
    # 此时的标量3会广播成 [[3, 3], [3, 3]]
    sum = b + [[3, 3], [3, 3]]
    print(sum)
    # 此时的一维数组[2,5]会广播成 [[2,5], [2,5]]
    sum = b + np.array([2, 5])
    print(sum)
    # 此时的只有一列的二维数组[[2], [5]]会广播成 [[2,2], [5,5]]
    sum = b + np.array([[2], [5]])
    print(sum)
    # 个人总结:
    # 1.只有某一个轴的长度为1,而其他轴的长度相等时,轴为1的那个维度会广播成与之相运算的数组的长度
    # 2.标量则直接广播成相应形状的数组与之相运算

教程