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

article/2025/10/15 20:22:02

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

🔥本文已收录于Python基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。
🔥文章和代码已归档至【Github仓库】,需要的朋友们自取。或者关注公众号【AIShareLab】,回复 python基础 也可获取。

在这里插入图片描述

文章目录

    • 10.1 为什么要用Numpy
      • 10.1.1  低效的Python for循环
      • 10.1.2  Numpy为什么如此高效
      • 10.1.3  什么时候用Numpy
    • 10.2 Numpy数组的创建
      • 10.2.1 从列表开始创建
      • 10.2.2 从头创建数组
    • 10.3 Numpy数组的性质
      • 10.3.1 数组的属性
      • 10.3.2 数组索引
      • 10.3.3 数组的切片
      • 10.3.4 数组的变形
      • 10.3.5 数组的拼接
      • 10.3.6 数组的分裂
    • 10.4 Numpy四大运算
      • 10.4.1 向量化运算
      • 10.4.2 矩阵运算
      • 10.4.3 广播运算
      • 10.4.4 比较运算和掩码
      • 10.4.5 花哨的索引
    • 10.5 其他Numpy通用函数
      • 10.5.1 数值排序
      • 10.5.2 最大最小值
      • 10.5.3 数值求和、求积
      • 10.5.4 中位数、均值、方差、标准差

10.1 为什么要用Numpy

image-20220929215806158

10.1.1  低效的Python for循环

【例】 求100万个数的倒数

def compute_reciprocals(values):res = []for value in values:      # 每遍历到一个元素,就要判断其类型,并查找适用于该数据类型的正确函数res.append(1/value)return resvalues = 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 npvalues = 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 npx = 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 np
x = 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 np
np.random.choice(10, 10)
array([0, 0, 9, 5, 8, 5, 2, 4, 9, 8])
x = np.arange(5).reshape(1, 5)
x
x.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数组的性质

image-20220929215820510

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] = 0
x5
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] = 0
x6
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] = 0
x5
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]=0
x6
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]=0
x6
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]=10
x6
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] = 0
x1
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] = 0
x1
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.T
y
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 广播运算

image-20220929215756259

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通用函数

image-20220929215850491

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: 48
min: 30
print("max_index:", np.argmax(x))
print("min_index:", np.argmin(x))
max_index: 0
min_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 pltplt.hist(x, bins=50)
plt.show()

image-20220929215113254

  • 中位数
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

http://chatgpt.dhexx.cn/article/ZhdLcV0Y.shtml

相关文章

【python学习】最全Numpy教程

1. Numpy概述 NumPy&#xff08;Numerical Python的简称&#xff09;是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。1.1.1. Why NumPy? 1.一个强大的N维数组对象ndarray&#xff0c;具有矢量算术运算和复杂广播能力的快速且节省空…

Python Numpy库教程

目录 1 Numpy概述1.1 概念1.2 功能1.3 对象1.4 数据类型1.5 数组属性 2 Numpy数组操作2.1 Numpy创建2.1.1 利用列表生成数组2.1.2 利用random模块生成数组2.1.3 创建特定形状数组 2.2 索引和切片2.2.1 元素表示2.2.2 切片表示2.2.3 多维数组的切片2.2.4 布尔索引2.2.5 元素查找…

【数据分析】Numpy入门教程(超详细)

Numpy 教程 什么是Numpy&#xff1f;Numpy(Numerical Python)是一个Python扩展库&#xff0c;支持大量的维度数组和矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 其主要用于数组计算&#xff0c;特点包括&#xff1a; 一个强大的N维数组对象ndarray广播功…

Python之Numpy详细教程

NumPy - 简介 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray &#xff0c;它拥有一些额外的功能。…

Java泛型方法的定义和使用

目录 一、基本介绍1、Java泛型的基本语法格式为:2、在使用泛型时,还需要注意以下几点:二、泛型的优点1、类型安全2、消除强制类型转换3、更高的效率4、潜在的性能收益三、常见泛型字母含义四、使用泛型时的注意事项五、泛型的使用1、泛型类2、泛型接口3、泛型通配符4、泛型方…

java参数传入泛型类型_java泛型方法参数传递

Java参数&#xff0c;不管是原始类型还是引用类型&#xff0c;传递的都是副本(有另外一种说法是传值&#xff0c;但是说传副本更好理解吧&#xff0c;传值通常是相对传址而言)。 如果参数类型是原始类型&#xff0c;那么传过来的就是这个参数的一个副本&#xff0c;也就是这个…

Java 泛型作为方法参数

Java 泛型作为方法参数 例程源码&#xff1a; import java.util.List;public class GoodsSeller {public void sellGoods(List<? extends Goods> goods){//调用集合中的sell方法for(Goods g:goods){g.sell();}} }public class Book extends Goods {Overridepublic void …

49天精通Java,第32天,Java泛型方法的定义和使用

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于Java基础教程(入门篇),包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识…

java泛型 方法返回值带有泛型 <T>

方法返回值前的<T>的左右是告诉编译器&#xff0c;当前的方法的值传入类型可以和类初始化的泛型类不同&#xff0c;也就是该方法的泛型类可以自定义&#xff0c;不需要跟类初始化的泛型类相同。 转自&#xff1a;https://blog.csdn.net/huyashangding/article/details/9…

Java 泛型方法/接口、泛型限定

文章目录一、为什么要定义泛型方法1、从泛型类到泛型方法的演变过程2、定义泛型方法的好处二、创建一个泛型方法格式常用的形式三、泛型接口1、格式2、例子四、类型通配符(泛型的高级应用)1、什么是通配符 (?)2、类型通配符上限定(? extends T >可以接收T类型或者T的子类型…

Java 泛型方法

本文包含&#xff1a; 定义泛型方法泛型方法和类型通配符的区别Java 7 的“菱形”语法与泛型构造器设定通配符下限泛型方法与方法重载Java 8 改进的类型推断 1. 定义泛型方法 假设需要实现这样一个方法&#xff1a;该方法负责将一个 Object 数组的所有元素添加到一个 Collec…

【java】泛型方法的定义

一、定义泛型方法的格式 二、调用泛型方法的语法格式 三、解释 1、定义泛型方法时&#xff0c;必须在返回值前边加一个<T>&#xff0c;来声明这是一个泛型方法&#xff0c;持有一个泛型T&#xff0c;然后才可以用泛型T作为方法的返回值。 2、Class<T>的作用就是指…

Java 中的泛型(两万字超全详解)

文章目录 前言一、泛型概述1. 什么是泛型&#xff1f;为什么要使用泛型&#xff1f;2. 泛型使用场景3. 泛型概述小结 二、泛型类1. 泛型类的定义2. 泛型类的使用 三、泛型接口四、泛型方法1. 泛型方法的定义2. 泛型方法的使用3. 泛型方法中的类型推断 五、类型擦除1. 什么是类型…

Java中的泛型方法

泛型是什么意思在这就不多说了&#xff0c;而Java中泛型类的定义也比较简单&#xff0c;例如&#xff1a;public class Test{}。这样就定义了一个泛型类Test&#xff0c;在实例化该类时&#xff0c;必须指明泛型T的具体类型&#xff0c;例如&#xff1a;Test t new Test();&am…

【软件测试】使用C++ Test进行动态测试

测试目的 1.掌握动态测试的方法。 2.掌握使用Parasoft C Test进行动态测试。 测试环境 Windows XP, Parasoft C Test 9.2 测试内容 使用Parasoft C Test进行动态测试&#xff0c;包括自动化测试、自定义测试用例、数据源测试用例、桩函数机制。 测试过程及结果 4.1 基于…

测试基础-动态白盒测试

1.动态白盒测试 定义&#xff1a;也称结构化测试。利用查看代码功能&#xff08;作什么&#xff09;和实现方式&#xff08;怎么做&#xff09;得到的信息来确定哪些需要测试、哪些不需要测试、如何开展测试。 动态白盒测试包括以下4个部分&#xff1a; 直接测试底层函数、过…

符合功能安全要求的动态测试工具-TESSY

Tessy是一个专门针对嵌入式软件的C/C代码进行单元、集成测试的工具&#xff0c;它可以自动化地执行测试、评估测试结果并生成测试报告。 Tessy的目标就是&#xff1a;通过自动化整个测试周期&#xff0c;支持针对C语言的单元测试/集成测试&#xff0c;同时&#xff0c;Tessy也…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖 符号测试错…

动态测试

动态测试 1.1 动态分析技术 虽然静态分析技术不需要软件的执行&#xff0c;而从动态分析本身来看更像是一个“测试”。它包含了系统的执行。当软件系统在模拟的或真实的环境中执行之前、之中和之后&#xff0c;对软件系统行为的分析是动态分析的主要特点。动态分析包含了程序在…

软件测试复习04:动态测试——黑盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 等价划分法边值分析法错误推测法因果图法示例 习题 等价划分法 等价类&#xff1a;一个几何&…