2024年Python最全Python基础(十) Numpy详细教程_python的numpy教程csdn,拿下offer全凭这套“面试+架构进阶知识点”pdf

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

+ - [10.2.1 从列表开始创建](#1021__80)
	- [10.2.2 从头创建数组](#1022__133)
+ [10.3 Numpy数组的性质](#103_Numpy_357)
+ - [10.3.1 数组的属性](#1031__361)
	- [10.3.2 数组索引](#1032__445)
	- [10.3.3 数组的切片](#1033__544)
	- [10.3.4 数组的变形](#1034__787)
	- [10.3.5 数组的拼接](#1035__999)
	- [10.3.6 数组的分裂](#1036__1105)
+ [10.4 Numpy四大运算](#104_Numpy_1208)
+ - [10.4.1 向量化运算](#1041__1213)
	- [10.4.2 矩阵运算](#1042__1405)
	- [10.4.3 广播运算](#1043__1502)
	- [10.4.4 比较运算和掩码](#1044__1639)
	- [10.4.5 花哨的索引](#1045___1823)
+ [10.5 其他Numpy通用函数](#105_Numpy_1915)
+ - [10.5.1 数值排序](#1051___1919)
	- [10.5.2 最大最小值](#1052___1991)
	- [10.5.3 数值求和、求积](#1053___2024)
	- [10.5.4 中位数、均值、方差、标准差](#1054___2137)

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 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 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)



### 最后

> **🍅 硬核资料**:关注即可领取PPT模板、简历模板、行业经典书籍PDF。  
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。  
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。  
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值