写点什么

Python 基础(十) | Numpy 详细教程

作者:timerring
  • 2022 年 10 月 07 日
    山东
  • 本文字数:9016 字

    阅读完需:约 30 分钟

⭐本专栏旨在对 Python 的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握 python 编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。

🔥本文已收录于 Python 基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。


10.1 为什么要用 Numpy

10.1.1  低效的 Python for 循环

【例】 求 100 万个数的倒数


def compute_reciprocals(values):    res = []    for value in values:      # 每遍历到一个元素,就要判断其类型,并查找适用于该数据类型的正确函数        res.append(1/value)    return res

values = list(range(1, 1000000))%timeit compute_reciprocals(values)
复制代码


145 ms ± 13.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
复制代码


%timeit :ipython 中统计运行时间的魔术方法(多次运行取平均值)


import numpy as np
values = np.arange(1, 1000000)%timeit 1/values
复制代码


5.99 ms ± 33.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
复制代码


实现相同计算,Numpy 的运行速度是 Python 循环的 25 倍,产生了质的飞跃

10.1.2  Numpy 为什么如此高效

Numpy 是由 C 语言编写的


1、编译型语言 VS 解释型语言


C 语言执行时,对代码进行整体编译,速度更快


2、连续单一类型存储 VS 分散多变类型存储


(1)Numpy 数组内的数据类型必须是统一的,如全部是浮点型,而 Python 列表支持任意类型数据的填充


(2)Numpy 数组内的数据连续存储在内存中,而 Python 列表的数据分散在内存中


这种存储结构,与一些更加高效的底层处理方式更加的契合


3、多线程 VS 线程锁


Python 语言执行时有线程锁,无法实现真正的多线程并行,而 C 语言可以

10.1.3  什么时候用 Numpy

在数据处理的过程中,遇到使用“Python for 循环” 实现一些向量化、矩阵化操作的时候,要优先考虑用 Numpy


如: 1、两个向量的点乘


   2、矩阵乘法

10.2 Numpy 数组的创建

10.2.1 从列表开始创建

import numpy as np
x = np.array([1, 2, 3, 4, 5])print(x)
复制代码


[1 2 3 4 5]
复制代码


print(type(x))print(x.shape)
复制代码


<class 'numpy.ndarray'>(5,)
复制代码


  • 设置数组的数据类型


x = np.array([1, 2, 3, 4, 5], dtype="float32")print(x)print(type(x[0]))
复制代码


[1. 2. 3. 4. 5.]<class 'numpy.float32'>
复制代码


  • 二维数组


x = np.array([[1, 2, 3],             [4, 5, 6],             [7, 8, 9]])print(x)print(x.shape)
复制代码


[[1 2 3] [4 5 6] [7 8 9]](3, 3)
复制代码

10.2.2 从头创建数组

(1)创建长度为 5 的数组,值都为 0


np.zeros(5, dtype=int)
复制代码


array([0, 0, 0, 0, 0])
复制代码


(2)创建一个 2*4 的浮点型数组,值都为 1


np.ones((2, 4), dtype=float)
复制代码


array([[1., 1., 1., 1.],       [1., 1., 1., 1.]])
复制代码


(3)创建一个 3*5 的数组,值都为 8.8


np.full((3, 5), 8.8)
复制代码


array([[8.8, 8.8, 8.8, 8.8, 8.8],       [8.8, 8.8, 8.8, 8.8, 8.8],       [8.8, 8.8, 8.8, 8.8, 8.8]])
复制代码


(4)创建一个 3*3 的单位矩阵


np.eye(3)
复制代码


array([[1., 0., 0.],       [0., 1., 0.],       [0., 0., 1.]])
复制代码


(5)创建一个线性序列数组,从 1 开始,到 15 结束,步长为 2


np.arange(1, 15, 2)
复制代码


array([ 1,  3,  5,  7,  9, 11, 13])
复制代码


(6)创建一个 4 个元素的数组,这四个数均匀的分配到 0~1


np.linspace(0, 1, 4)
复制代码


array([0.        , 0.33333333, 0.66666667, 1.        ])
复制代码


(7)创建一个 10 个元素的数组,形成 1~10^9 的等比数列


np.logspace(0, 9, 10)
复制代码


array([1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07,       1.e+08, 1.e+09])
复制代码


(8)创建一个 3*3 的,在 0~1 之间均匀分布的随机数构成的数组


np.random.random((3,3))
复制代码


array([[0.24347952, 0.41715541, 0.41363866],       [0.44869706, 0.18128167, 0.18568051],       [0.05705023, 0.0689205 , 0.74837661]])
复制代码


(9)创建一个 3*3 的,均值为 0,标准差为 1 的正态分布随机数构成的数组


np.random.normal(0, 1, (3,3))
复制代码


array([[-0.38530465,  0.17474932,  0.31129291],       [ 1.61626424, -2.18883854,  0.54043825],       [-0.9141666 , -0.03804043, -0.6645122 ]])
复制代码


(10)创建一个 3*3 的,在[0,10)之间随机整数构成的数组


np.random.randint(0, 10, (3,3))
复制代码


array([[9, 1, 9],       [0, 3, 9],       [8, 5, 4]])
复制代码


(11)随机重排列


import numpy as npx = np.array([10, 20, 30, 40])np.random.permutation(x)       # 生产新列表,不会对原列表产生影响。
复制代码


array([30, 40, 20, 10])
复制代码


print(x)np.random.shuffle(x)          # 修改原列表print(x)
复制代码


[10 20 30 40][20 40 10 30]
复制代码


(12)随机采样


  • 按指定形状采样


x = np.arange(10, 25, dtype = float)x
复制代码


array([10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22.,       23., 24.])
复制代码


np.random.choice(x, size=(4, 3))
复制代码


array([[19., 23., 22.],       [22., 21., 13.],       [15., 21., 17.],       [14., 23., 19.]])
复制代码


import numpy as npnp.random.choice(10, 10)
复制代码


array([0, 0, 9, 5, 8, 5, 2, 4, 9, 8])
复制代码


x = np.arange(5).reshape(1, 5)xx.sum(axis=1, keepdims=True)
复制代码


array([[10]])
复制代码


  • 按概率采样


np.random.choice(x, size=(4, 3), p=x/np.sum(x))
复制代码


array([[15., 21., 20.],       [23., 17., 18.],       [23., 15., 17.],       [19., 24., 22.]])
复制代码

10.3 Numpy 数组的性质

10.3.1 数组的属性

x = np.random.randint(10, size=(3, 4))x
复制代码


array([[5, 5, 2, 7],       [2, 3, 0, 8],       [3, 8, 1, 7]])
复制代码


1、数组的形状 shape


x.shape
复制代码


(3, 4)
复制代码


2、数组的维度 ndim


x.ndim
复制代码


2
复制代码


y = np.arange(10)
复制代码


array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
复制代码


y.ndim
复制代码


1
复制代码


3、数组的大小 size


x.size
复制代码


12
复制代码


4、数组的数据类型 dtype


x.dtype
复制代码


dtype('int32')
复制代码

10.3.2 数组索引

1、一维数组的索引


x1 = np.arange(10)x1
复制代码


array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
复制代码


x1[0]
复制代码


0
复制代码


x1[5]
复制代码


5
复制代码


x1[-1]
复制代码


9
复制代码


2、多维数组的索引——以二维为例


x2 = np.random.randint(0, 20, (2,3))x2
复制代码


array([[11,  3, 11],       [ 6,  1,  5]])
复制代码


x2[0, 0]
复制代码


11
复制代码


x2[0][0]
复制代码


11
复制代码


注意:numpy 数组的数据类型是固定的,向一个整型数组插入一个浮点值,浮点值会向下进行取整


x2[0, 0] = 1.618
复制代码


x2
复制代码


array([[ 1,  3, 11],       [ 6,  1,  5]])
复制代码

10.3.3 数组的切片

1、一维数组——跟列表一样


x1 = np.arange(10)x1
复制代码


array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
复制代码


x1[:3]
复制代码


array([0, 1, 2])
复制代码


x1[3:]
复制代码


array([3, 4, 5, 6, 7, 8, 9])
复制代码


x1[::-1]
复制代码


array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
复制代码


2、多维数组——以二维为例


x2 = np.random.randint(20, size=(3,4)) x2
复制代码


array([[14,  9, 15,  8],       [18,  8, 16, 17],       [ 0,  8,  2, 17]])
复制代码


x2[:2, :3]             # 前两行,前三列
复制代码


array([[14,  9, 15],       [18,  8, 16]])
复制代码


x2[:2, 0:3:2]       # 前两行 前三列(每隔一列)
复制代码


array([[14, 15],       [18, 16]])
复制代码


x2[::-1, ::-1]
复制代码


array([[17,  2,  8,  0],       [17, 16,  8, 18],       [ 8, 15,  9, 14]])
复制代码


3、获取数组的行和列


x3 = np.random.randint(20, size=(3,4)) x3
复制代码


array([[ 8, 13, 15,  7],       [19, 13, 17,  6],       [11,  2,  0, 12]])
复制代码


x3[1, :]   #第一行  从0开始计数
复制代码


array([19, 13, 17,  6])
复制代码


x3[1]    # 第一行简写
复制代码


array([19, 13, 17,  6])
复制代码


x3[:, 2]  # 第二列   从0开始计数
复制代码


array([15, 17,  0])
复制代码


4、切片获取的是视图,而非副本


x4 = np.random.randint(20, size=(3,4)) x4
复制代码


array([[ 5, 14,  7,  2],       [ 8, 12,  9,  3],       [19,  0, 10,  7]])
复制代码


x5 = x4[:2, :2]x5
复制代码


array([[ 5, 14],       [ 8, 12]])
复制代码


注意:视图元素发生修改,则原数组亦发生相应修改


x5[0, 0] = 0x5
复制代码


array([[ 0, 14],       [ 8, 12]])
复制代码


x4
复制代码


array([[ 0, 14,  7,  2],       [ 8, 12,  9,  3],       [19,  0, 10,  7]])
复制代码


修改切片的安全方式:copy


x4 = np.random.randint(20, size=(3,4)) x4
复制代码


array([[18, 14, 10, 12],       [10, 16,  7, 19],       [ 3, 16,  3, 12]])
复制代码


x6 = x4[:2, :2].copy()x6
复制代码


array([[18, 14],       [10, 16]])
复制代码


x6[0, 0] = 0x6
复制代码


array([[ 0, 14],       [10, 16]])
复制代码


x4
复制代码


array([[18, 14, 10, 12],       [10, 16,  7, 19],       [ 3, 16,  3, 12]])
复制代码

10.3.4 数组的变形

x5 = np.random.randint(0, 10, (12,))x5
复制代码


array([5, 0, 1, 3, 2, 6, 3, 8, 7, 5, 2, 5])
复制代码


x5.shape
复制代码


(12,)
复制代码


x6 = x5.reshape(3, 4)x6
复制代码


array([[9, 8, 5, 9],       [2, 6, 2, 9],       [4, 5, 1, 7]])
复制代码


注意:reshape 返回的是视图,而非副本


x6[0, 0] = 0x5
复制代码


array([0, 8, 5, 9, 2, 6, 2, 9, 4, 5, 1, 7])
复制代码


一维向量转行向量


x7 = x5.reshape(1, x5.shape[0])    x7
复制代码


array([[0, 8, 5, 9, 2, 6, 2, 9, 4, 5, 1, 7]])
复制代码


x8 = x5[np.newaxis, :]x8
复制代码


array([[0, 8, 5, 9, 2, 6, 2, 9, 4, 5, 1, 7]])
复制代码


一维向量转列向量


x7 = x5.reshape(x5.shape[0], 1)    x7
复制代码


array([[0],       [8],       [5],       [9],       [2],       [6],       [2],       [9],       [4],       [5],       [1],       [7]])
复制代码


x8 = x5[:, np.newaxis]x8
复制代码


array([[0],       [8],       [5],       [9],       [2],       [6],       [2],       [9],       [4],       [5],       [1],       [7]])
复制代码


多维向量转一维向量


x6 = np.random.randint(0, 10, (3, 4))x6
复制代码


array([[3, 7, 6, 4],       [4, 5, 6, 3],       [7, 6, 2, 3]])
复制代码


flatten 返回的是副本


x9 = x6.flatten()x9
复制代码


array([3, 7, 6, 4, 4, 5, 6, 3, 7, 6, 2, 3])
复制代码


x9[0]=0x6
复制代码


array([[3, 7, 6, 4],       [4, 5, 6, 3],       [7, 6, 2, 3]])
复制代码


ravel 返回的是视图


x10 = x6.ravel()x10
复制代码


array([3, 7, 6, 4, 4, 5, 6, 3, 7, 6, 2, 3])
复制代码


x10[0]=0x6
复制代码


array([[0, 7, 6, 4],       [4, 5, 6, 3],       [7, 6, 2, 3]])
复制代码


reshape 返回的是视图


x11 = x6.reshape(-1)x11
复制代码


array([0, 7, 6, 4, 4, 5, 6, 3, 7, 6, 2, 3])
复制代码


x11[0]=10x6
复制代码


array([[10,  7,  6,  4],       [ 4,  5,  6,  3],       [ 7,  6,  2,  3]])
复制代码

10.3.5 数组的拼接

x1 = np.array([[1, 2, 3],              [4, 5, 6]])x2 = np.array([[7, 8, 9],              [0, 1, 2]])
复制代码


1、水平拼接——非视图


  • hstack()

  • c_


x3 = np.hstack([x1, x2])x3
复制代码


array([[1, 2, 3, 7, 8, 9],       [4, 5, 6, 0, 1, 2]])
复制代码


x3[0][0] = 0x1
复制代码


array([[1, 2, 3],       [4, 5, 6]])
复制代码


x4 = np.c_[x1, x2]x4
复制代码


array([[1, 2, 3, 7, 8, 9],       [4, 5, 6, 0, 1, 2]])
复制代码


x4[0][0] = 0x1
复制代码


array([[1, 2, 3],       [4, 5, 6]])
复制代码


2、垂直拼接——非视图


  • vstack()

  • r_


x1 = np.array([[1, 2, 3],              [4, 5, 6]])x2 = np.array([[7, 8, 9],              [0, 1, 2]])
复制代码


x5 = np.vstack([x1, x2])x5
复制代码


array([[1, 2, 3],       [4, 5, 6],       [7, 8, 9],       [0, 1, 2]])
复制代码


x6 = np.r_[x1, x2]x6
复制代码


array([[1, 2, 3],       [4, 5, 6],       [7, 8, 9],       [0, 1, 2]])
复制代码

10.3.6 数组的分裂

1、split 的用法


x6 = np.arange(10)x6
复制代码


array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
复制代码


x1, x2, x3 = np.split(x6, [2, 7]) #分裂点的位置,前向(从0开始)print(x1, x2, x3)
复制代码


[0 1] [2 3 4 5 6] [7 8 9]
复制代码


2、hsplit 的用法


x7 = np.arange(1, 26).reshape(5, 5)x7
复制代码


array([[ 1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10],       [11, 12, 13, 14, 15],       [16, 17, 18, 19, 20],       [21, 22, 23, 24, 25]])
复制代码


left, middle, right = np.hsplit(x7, [2,4])print("left:\n", left)            # 第0~1列print("middle:\n", middle)        # 第2~3列print("right:\n", right)          # 第4列
复制代码


left: [[ 1  2] [ 6  7] [11 12] [16 17] [21 22]]middle: [[ 3  4] [ 8  9] [13 14] [18 19] [23 24]]right: [[ 5] [10] [15] [20] [25]]
复制代码


3、vsplit 的用法


x7 = np.arange(1, 26).reshape(5, 5)x7
复制代码


array([[ 1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10],       [11, 12, 13, 14, 15],       [16, 17, 18, 19, 20],       [21, 22, 23, 24, 25]])
复制代码


upper, middle, lower = np.vsplit(x7, [2,4])print("upper:\n", upper)         # 第0~1行print("middle:\n", middle)       # 第2~3行print("lower:\n", lower)         # 第4行
复制代码


upper: [[ 1  2  3  4  5] [ 6  7  8  9 10]]middle: [[11 12 13 14 15] [16 17 18 19 20]]lower: [[21 22 23 24 25]]
复制代码

10.4 Numpy 四大运算

10.4.1 向量化运算

1、与数字的加减乘除等 可见整体进行了向量化的运算


x1 = np.arange(1,6)x1
复制代码


array([1, 2, 3, 4, 5])
复制代码


print("x1+5", x1+5)print("x1-5", x1-5)print("x1*5", x1*5)print("x1/5", x1/5)
复制代码


x1+5 [ 6  7  8  9 10]x1-5 [-4 -3 -2 -1  0]x1*5 [ 5 10 15 20 25]x1/5 [0.2 0.4 0.6 0.8 1. ]
复制代码


print("-x1", -x1)print("x1**2", x1**2)print("x1//2", x1//2)print("x1%2", x1%2)
复制代码


-x1 [-1 -2 -3 -4 -5]x1**2 [ 1  4  9 16 25]x1//2 [0 1 1 2 2]x1%2 [1 0 1 0 1]
复制代码


2、绝对值、三角函数、指数、对数


(1)绝对值


x2 = np.array([1, -1, 2, -2, 0])x2
复制代码


array([ 1, -1,  2, -2,  0])
复制代码


abs(x2)
复制代码


array([1, 1, 2, 2, 0])
复制代码


np.abs(x2)
复制代码


array([1, 1, 2, 2, 0])
复制代码


(2)三角函数


theta = np.linspace(0, np.pi, 3)theta
复制代码


array([0.        , 1.57079633, 3.14159265])
复制代码


print("sin(theta)", np.sin(theta))print("con(theta)", np.cos(theta))print("tan(theta)", np.tan(theta))
复制代码


sin(theta) [0.0000000e+00 1.0000000e+00 1.2246468e-16]con(theta) [ 1.000000e+00  6.123234e-17 -1.000000e+00]tan(theta) [ 0.00000000e+00  1.63312394e+16 -1.22464680e-16]
复制代码


x = [1, 0 ,-1]print("arcsin(x)", np.arcsin(x))print("arccon(x)", np.arccos(x))print("arctan(x)", np.arctan(x))
复制代码


arcsin(x) [ 1.57079633  0.         -1.57079633]arccon(x) [0.         1.57079633 3.14159265]arctan(x) [ 0.78539816  0.         -0.78539816]
复制代码


(3)指数运算


x = np.arange(3)x
复制代码


array([0, 1, 2])
复制代码


np.exp(x)
复制代码


array([1.        , 2.71828183, 7.3890561 ])
复制代码


(4)对数运算


x = np.array([1, 2, 4, 8 ,10])print("ln(x)", np.log(x))print("log2(x)", np.log2(x))print("log10(x)", np.log10(x))
复制代码


ln(x) [0.         0.69314718 1.38629436 2.07944154 2.30258509]log2(x) [0.         1.         2.         3.         3.32192809]log10(x) [0.         0.30103    0.60205999 0.90308999 1.        ]
复制代码


3、两个数组的运算


x1 = np.arange(1,6)x1
复制代码


array([1, 2, 3, 4, 5])
复制代码


x2 = np.arange(6,11)x2
复制代码


array([ 6,  7,  8,  9, 10])
复制代码


print("x1+x2:", x1+x2)print("x1-x2:", x1-x2)print("x1*x2:", x1*x2)print("x1/x2:", x1/x2)
复制代码


x1+x2: [ 7  9 11 13 15]x1-x2: [-5 -5 -5 -5 -5]x1*x2: [ 6 14 24 36 50]x1/x2: [0.16666667 0.28571429 0.375      0.44444444 0.5       ]
复制代码

10.4.2 矩阵运算

x = np.arange(9).reshape(3, 3)x
复制代码


array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])
复制代码


  • 矩阵的转置


y = x.Ty
复制代码


array([[0, 3, 6],       [1, 4, 7],       [2, 5, 8]])
复制代码


  • 矩阵乘法


x = np.array([[1, 0],             [1, 1]])y = np.array([[0, 1],             [1, 1]])
复制代码


x.dot(y)
复制代码


array([[0, 1],       [1, 2]])
复制代码


np.dot(x, y)
复制代码


array([[0, 1],       [1, 2]])
复制代码


y.dot(x)
复制代码


array([[1, 1],       [2, 1]])
复制代码


np.dot(y, x)
复制代码


array([[1, 1],       [2, 1]])
复制代码


注意跟 x*y 的区别,x*y 只是对应位置相乘


x*y
复制代码


array([[0, 0],       [1, 1]])
复制代码

10.4.3 广播运算


x = np.arange(3).reshape(1, 3)x
复制代码


array([[0, 1, 2]])
复制代码


x+5
复制代码


array([[5, 6, 7]])
复制代码


规则


如果两个数组的形状在维度上不匹配


那么数组的形式会沿着维度为 1 的维度进行扩展以匹配另一个数组的形状。


x1 = np.ones((3,3))x1
复制代码


array([[1., 1., 1.],       [1., 1., 1.],       [1., 1., 1.]])
复制代码


x2 = np.arange(3).reshape(1, 3)x2
复制代码


array([[0, 1, 2]])
复制代码


x1+x2
复制代码


array([[1., 2., 3.],       [1., 2., 3.],       [1., 2., 3.]])
复制代码


x3 = np.logspace(1, 10, 10, base=2).reshape(2, 5)x3
复制代码


array([[   2.,    4.,    8.,   16.,   32.],       [  64.,  128.,  256.,  512., 1024.]])
复制代码


x4 = np.array([[1, 2, 4, 8, 16]])x4
复制代码


array([[ 1,  2,  4,  8, 16]])
复制代码


x3/x4
复制代码


array([[ 2.,  2.,  2.,  2.,  2.],       [64., 64., 64., 64., 64.]])
复制代码


x5 = np.arange(3).reshape(3, 1)x5
复制代码


array([[0],       [1],       [2]])
复制代码


x6 = np.arange(3).reshape(1, 3)x6
复制代码


array([[0, 1, 2]])
复制代码


x5+x6
复制代码


array([[0, 1, 2],       [1, 2, 3],       [2, 3, 4]])
复制代码

10.4.4 比较运算和掩码

1、比较运算


x1 = np.random.randint(100, size=(10,10))x1
复制代码


array([[37, 44, 58, 79,  1, 24, 85, 90, 27, 56],       [74, 68, 88, 27, 46, 34, 92,  1, 35, 45],       [84, 80, 83, 72, 98, 15,  4, 77, 14, 98],       [19, 85, 98, 32, 47, 50, 73,  3, 24,  2],       [ 5, 28, 26, 31, 48, 43, 72, 73, 53, 64],       [81, 87, 56, 59, 24, 42, 84, 34, 97, 65],       [74,  9, 41, 54, 78, 62, 53, 49,  8, 70],       [63, 44, 33, 35, 26, 83,  7, 14, 65, 84],       [57, 10, 62,  8, 74, 47, 90, 25, 78, 48],       [36, 31, 45, 39, 66, 82, 42, 25, 33, 84]])
复制代码


x1 > 50
复制代码


array([[False, False,  True,  True, False, False,  True,  True, False,         True],       [ True,  True,  True, False, False, False,  True, False, False,        False],       [ True,  True,  True,  True,  True, False, False,  True, False,         True],       [False,  True,  True, False, False, False,  True, False, False,        False],       [False, False, False, False, False, False,  True,  True,  True,         True],       [ True,  True,  True,  True, False, False,  True, False,  True,         True],       [ True, False, False,  True,  True,  True,  True, False, False,         True],       [ True, False, False, False, False,  True, False, False,  True,         True],       [ True, False,  True, False,  True, False,  True, False,  True,        False],       [False, False, False, False,  True,  True, False, False, False,         True]])
复制代码


2、操作布尔数组


x2 = np.random.randint(10, size=(3, 4))x2
复制代码


array([[1, 4, 2, 9],       [8, 8, 2, 4],       [9, 5, 3, 6]])
复制代码


print(x2 > 5)np.sum(x2 > 5)
复制代码


[[False False False  True] [ True  True False False] [ True False False  True]]
5
复制代码


np.all(x2 > 0)
复制代码


True
复制代码


np.any(x2 == 6)
复制代码


True
复制代码


np.all(x2 < 9, axis=1)   # 按行进行判断 axis = 1。而如果是按列判断,则axis= 0;
复制代码


array([False,  True, False])
复制代码


x2
复制代码


array([[1, 4, 2, 9],       [8, 8, 2, 4],       [9, 5, 3, 6]])
复制代码


(x2 < 9) & (x2 >5)
复制代码


array([[False, False, False, False],       [ True,  True, False, False],       [False, False, False,  True]])
复制代码


np.sum((x2 < 9) & (x2 >5))
复制代码


3
复制代码


3、将布尔数组作为掩码


x2
复制代码


array([[1, 4, 2, 9],       [8, 8, 2, 4],       [9, 5, 3, 6]])
复制代码


x2 > 5
复制代码


array([[False, False, False,  True],       [ True,  True, False, False],       [ True, False, False,  True]])
复制代码


x2[x2 > 5]
复制代码


array([9, 8, 8, 9, 6])
复制代码


作为掩码后,相应位置为 True 的就会被取出来,而相应位置为 False 的就会忽略

10.4.5 花哨的索引

1、一维数组


x = np.random.randint(100, size=10)x
复制代码


array([43, 69, 67,  9, 11, 27, 55, 93, 23, 82])
复制代码


注意:结果的形状与索引数组 ind 一致


ind = [2, 6, 9]x[ind]
复制代码


array([67, 55, 82])
复制代码


ind = np.array([[1, 0],               [2, 3]])x[ind]
复制代码


array([[69, 43],       [67,  9]])
复制代码


2、多维数组


x = np.arange(12).reshape(3, 4)x
复制代码


array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
复制代码


row = np.array([0, 1, 2])col = np.array([1, 3, 0])x[row, col]               # x(0, 1) x(1, 3) x(2, 0)
复制代码


array([1, 7, 8])
复制代码


row[:, np.newaxis]       # 列向量
复制代码


array([[0],       [1],       [2]])
复制代码


x[row[:, np.newaxis], col]    # 广播机制
复制代码


array([[ 1,  3,  0],       [ 5,  7,  4],       [ 9, 11,  8]])
复制代码

10.5 其他 Numpy 通用函数

10.5.1 数值排序

x = np.random.randint(20, 50, size=10)x
复制代码


array([48, 27, 44, 24, 34, 21, 24, 30, 34, 46])
复制代码


  • 产生新的排序数组


np.sort(x)
复制代码


array([21, 24, 24, 27, 30, 34, 34, 44, 46, 48])
复制代码


x
复制代码


array([48, 27, 44, 24, 34, 21, 24, 30, 34, 46])
复制代码


  • 替换原数组


x.sort()x
复制代码


array([21, 24, 24, 27, 30, 34, 34, 44, 46, 48])
复制代码


  • 获得排序索引


x = np.random.randint(20, 50, size=10)x
复制代码


array([27, 36, 35, 28, 34, 20, 21, 49, 48, 30])
复制代码


i = np.argsort(x)i
复制代码


array([5, 6, 0, 3, 9, 4, 2, 1, 8, 7], dtype=int64)
复制代码

10.5.2 最大最小值

x = np.random.randint(20, 50, size=10)x
复制代码


array([48, 31, 30, 44, 48, 33, 44, 48, 39, 35])
复制代码


print("max:", np.max(x))print("min:", np.min(x))
复制代码


max: 48min: 30
复制代码


print("max_index:", np.argmax(x))print("min_index:", np.argmin(x))
复制代码


max_index: 0min_index: 2
复制代码

10.5.3 数值求和、求积

x = np.arange(1,6)x
复制代码


array([1, 2, 3, 4, 5])
复制代码


x.sum()
复制代码


15
复制代码


np.sum(x)
复制代码


15
复制代码


x1 = np.arange(6).reshape(2,3)x1
复制代码


array([[0, 1, 2],       [3, 4, 5]])
复制代码


  • 按行求和


np.sum(x1, axis=1)
复制代码


array([ 3, 12])
复制代码


  • 按列求和


np.sum(x1, axis=0)
复制代码


array([3, 5, 7])
复制代码


  • 全体求和


np.sum(x1)
复制代码


15
复制代码


  • 求积


x
复制代码


array([1, 2, 3, 4, 5])
复制代码


x.prod()
复制代码


120
复制代码


np.prod(x)
复制代码


120
复制代码

10.5.4 中位数、均值、方差、标准差

x = np.random.normal(0, 1, size=10000)
复制代码


import matplotlib.pyplot as plt
plt.hist(x, bins=50)plt.show()
复制代码



  • 中位数


np.median(x)
复制代码


-0.01024418366119727
复制代码


  • 均值


x.mean()
复制代码


-0.004164442327293362
复制代码


np.mean(x)
复制代码


-0.004164442327293362
复制代码


  • 方差


x.var()
复制代码


1.0221853234535774
复制代码


np.var(x)
复制代码


1.0221853234535774
复制代码


  • 标准差


x.std()
复制代码


1.0110318112965473
复制代码


np.std(x)
复制代码


1.0110318112965473
复制代码


发布于: 刚刚阅读数: 3
用户头像

timerring

关注

还未添加个人签名 2022.07.14 加入

还未添加个人简介

评论

发布
暂无评论
Python基础(十) | Numpy详细教程_Numpy库_timerring_InfoQ写作社区