Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-1

简介: Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)

NumPy模块

1.1 什么是NumPy?

NumPy(Numerical Python) 是科学计算基础库,它提供了大量科学计算相关功能。比如数据统计,随机数生成等。其提供最核心类型为多维数组类型(ndarray),支持大量的维度数组与矩阵运算,NumPy支持向量处理ndarray对象,提高程序运行速度。


1.2 NumPy的安装

安装NumPy最简单的方法就是使用pip工具,具体安装步骤如下:


1.2.1 按住 Win + R 键,输入cmd,然后回车

3a9e658496dbbda59d493bddfafd8fc4_ee99a60b4ea9487182501a7f86326432.png


1.2.2 输入命令

  • pip install numpy

注意:这种安装方式速度可能会比较慢,所以我们这里建议换源安装

1. 使用清华源进行pip安装


命令: pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple


示例: pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple





像上图出现Successfully 就说明我们的NumPy安装成功啦

【示例1】arange函数测试环境安装

# 导入numpy模块,
import numpy as np  # as是取别名
a = np.arange(10)  # 调用numpy模块中的arange函数,创建一个数组
print(a)
print(type(a))  # 查看a的类型

下面是运行结果:

[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>  # ndarray类型

【示例2】对列表中的元素开平方

# 导入numpy模块
import numpy as np
# 创建一个数组
b = [3, 6, 9]
# 对数组中的每一个数进行开平方
print(np.sqrt(b))

下面是运行结果:

[1.73205081 2.44948974 3.        ]

1.3 数组的创建

1.3.1 array创建

NumPy模块中的array函数可以生成多维数组。例如,如果要生成一个二维数组,需要向array函数传递一个列表类型的参数。每一个列表元素是一堆的ndarray类型数组,作为二维数组的行。另外,通过ndarray类的shape属性可以获得数组每一堆的元素个数(元组形式),也可以通过shape[n]形式获得每一堆的元素个数,其中n是维度,从0开始。

语法格式如下:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

下面是array函数的参数名称及其作用描述:

【示例1】使用array函数创建数组

import numpy as np
a = np.array([1, 2, 3])  # 创建一维数组
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  # 创建二维数组
c = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]])  # 创建三维数组
print(a)
print(b)
print(c)
print(type(a), type(b), type(c))

运行结果如下:

[1 2 3]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[[1 2 3]
  [4 5 6]
  [7 8 9]]]
<class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'numpy.ndarray'>

由上可知:使用array函数创建的数组都是ndarray对象

【示例2】array函数中dtype的使用

a = np.array([4, 5, 6], dtype=float)
b = np.array([4, 5, 6], dtype=complex)
print(a, type(a))
print(b, type(b))

运行结果如下:

[4. 5. 6.] <class 'numpy.ndarray'>
[4.+0.j 5.+0.j 6.+0.j] <class 'numpy.ndarray'>

由上可知:array函数中dtype参数可以设置创建数组内的元素类型

【示例3】array函数中ndmin的使用

a = np.array([4, 5, 6], ndmin=3)
print(a)
[[[4 5 6]]]

由上可知:array函数中ndmin参数可以设置创建数组的最小维度

1.3.2 arange创建

使用arange函数创建数值范围并返回ndarray对象,函数格式如下:

numpy.arange(start, stop, step, dtype)

下面是arange函数的参数名称及其作用描述:

【示例】使用arange函数创建数组

# 与range函数类似,括号内的范围是左闭右开
a = np.arange(11)  # 未设置起始值时,默认从0开始
b = np.arange(1, 11)  # 设置起始值和终止值,左闭右开
c = np.arange(1, 11, 2)  # 设置步长,默认值为1
d = np.arange(1, 11, 2, dtype=float)  # 设置数组元素的类型,这里设置为浮点型
print(a)
print(b)
print(c)
print(d)

运行结果如下:

[ 0  1  2  3  4  5  6  7  8  9 10]
[ 1  2  3  4  5  6  7  8  9 10]
[1 3 5 7 9]
[1. 3. 5. 7. 9.]
1.3.3 随机数创建

使用numpy.random.random(size=None),该方法返回[0.0, 1.0)范围的随机数。

格式如下:

numpy.random.random(size=None)

【示例1】使用numpy.random.random(size=None)创建一维数组

# size表示要生成的数组大小,size=5就表示包含 5 个元素的一维数组
a = np.random.random(size=5) 
print(a)

运行结果如下:

[0.84174708 0.60109444 0.93239501 0.36488593 0.24012724]

由运行结果可知:一维数组中的每个元素都是[0.0, 1.0)之间的随机数

【示例2】使用numpy.random.random(size=None)创建二维数组

# 函数的参数 size=(3, 4) 表示要生成的数组的形状为3行4列,即包含3个子数组,每个子数组包含4个元素。
a = np.random.random(size=(3, 4))
print(a)

运行结果如下:

[[0.32989944 0.76740016 0.10208365 0.01924679]
 [0.20753174 0.09438332 0.44283362 0.41200616]
 [0.89764502 0.62156786 0.06232488 0.40479654]]

【示例3】使用numpy.random.random(size=None)创建三维数组

# 由2个平面组成的三维数组。每个平面有3行4列的元素。
a = np.random.random(size=(2, 3, 4))
print(a)

运行结果如下:

[[[0.60235703 0.83229013 0.55511265 0.84317137]
  [0.26768256 0.98907851 0.97608121 0.33226806]
  [0.94246877 0.71305221 0.72211643 0.21610183]]

 [[0.61838121 0.28558197 0.24185245 0.09372992]
  [0.78479353 0.9609283  0.11742715 0.46640449]
  [0.04459701 0.07881661 0.32281088 0.54882584]]]
1.3.4 随机整数创建

语法格式:

numpy.random.randint(low, high=None, size=None, dtype=int)

下面是randint函数的参数名称及其作用描述:

384223df65c4b0e2409f71272c96711e_f5a956ca622341eca7bc37d6230d7838.png

【示例1】生成0到5的随机整数一维数组

# 生成一个长度为10的一维随机整数数组,其元素的取值范围在[0, 6)之间
random_int = np.random.randint(6, size=10)
print(random_int)

运行结果如下:

[1 3 5 5 5 3 4 5 3 4]

【示例2】生成0到5的随机整数二维数组

# 生成一个大小为3x4的二维随机整数数组,其中每个元素的取值范围在[0, 6)之间
random_int = np.random.randint(0, 6, size=(3, 4))
print(random_int)

运行结果如下:

[[3 5 1 5]
 [1 5 4 1]
 [3 1 2 2]]

【示例3】生成0到5的随机整数三维数组并查看类型

# 生成一个大小为2x4x3的三维随机整数数组,其中每个元素的取值范围在[0, 6)之间
random_int = np.random.randint(0, 6, size=(2, 4, 3), dtype=int64)  
# 默认的dtype为int32,这里修改为int64,一般使用默认的,不对其进行设置
print(random_int)
print(random_int.dtype)

运行结果如下:

[[[2 1 2]
  [2 1 2]
  [2 1 3]
  [1 2 5]]

 [[3 0 3]
  [1 4 1]
  [5 1 5]
  [1 5 4]]]
int64
1.3.5 其他方式创建

ndarray数组除了可以使用底层ndarray构造器来创建外,也可以通过以下几种方式来创建。


1. zeros创建指定大小的数组

注意:数组元素以0来填充

语法格式:

numpy.zeros(shape, dtype=float, order='C')

下面是arange函数的参数名称及其作用描述:

【示例】使用zeros创建数组

# 创建一维数组
a = np.zeros(5)
# 指定类型
a1 = np.zeros((5,), dtype=int)  # dtype指定为整型
# 创建二维数组
b = np.zeros((3, 4))
print(a)
print(a1)
print(b)

运行结果如下:

[0. 0. 0. 0. 0.]
[0 0 0 0 0]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
2. ones创建指定形状的数组

注意:数组元素以1来填充

语法格式:

numpy.ones(shape, dtype=float, order='C')

参数与zeros一样。

【示例】使用zeros创建数组

# 创建一维数组
a = np.ones(5)
# 指定类型
a1 = np.ones((5,), dtype=int)  # dtype指定为整型
# 创建二维数组
b = np.ones((3, 4))
print(a)
print(a1)
print(b)

运行结果如下:

[1. 1. 1. 1. 1.]
[1 1 1 1 1]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
3. empty创建指定形状、类型且未初始化的数组

里面的元素的值都是之前内存的值

语法格式:

numpy.empty(shape, dtype=float, order='C')

参数与zeros和ones一样。

【示例】使用empty创建数组

# 创建一维数组
a = np.empty(5)
# 创建二维数组
b = np.empty((3, 4))
print(a)
print(b)

运行结果如下:

[0.   0.25 0.5  0.75 1.  ]
[[0. 0. 1. 1.]
 [1. 1. 1. 1.]
 [1. 0. 0. 1.]]
4. linspace创建一维数组

注意:数组是由一个等差数列构成的

语法格式:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

下面是linspace函数的参数名称及其作用描述:

【示例】使用linspace创建数组

# linspace本身只能创建一维数组,但可以通过reshape()函数改变数组的形状,从而将其转换为多维数组。
a = np.linspace(1, 10, 10)
# linspace的参数使用
b = np.linspace(5, 20, 5, endpoint=False)  # 数列中是否包含结束值,默认是True,这里的结束值为20
print(a)
print(b)

运行结果如下:

[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
[ 5.  8. 11. 14. 17.]
5. logspace创建一维数组

注意:数组是由一个等比数列构成的

语法格式:

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)

下面是linspace函数的参数名称及其作用描述:

【示例】使用logspace创建数组

# logspace本身只能创建一维数组,但可以通过reshape()函数改变数组的形状,从而将其转换为多维数组。
# 参数base是对数的底数,默认为10.0,这里base修改成2,就是二的零次方到二的九次方,共十个数
a = np.logspace(0, 9, 10, base=2)
print(a)

运行结果如下:

[  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]

以上就是利用NumPy模块创建数组的方法啦。


1.4 NunPy创建正态分布

1.4.1 什么是正态分布?

  • 正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ,σ )。


正态分布的应用

生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。

正态分布特点

μ决定位置,标准差σ决定分布的幅度。当μ=0,σ=1时的正态分布是标准正态分布。

标准差的由来

是在概率论和统计方差衡量一组数据时离散程度的度量

其中M为平均值,n为数据总个数,σ为标准差,σ^2可以理解一个整体为方差

意义:

  • 衡量数据集中离散程度的统计量
  • 评估数据的稳定性与可靠性
  • 判断异常值
  • 比较数据集的差异

1.4.2 正态分布的创建

1 使用np.random.randn(d0,d1.…,dn)

功能:返回一个或一组样本,具有标准正态分布(期望为0,方差为1)。

其中dn表示维度,返回值为指定维度的array。

【示例1】创建标准正态分布

import numpy as np  # 导入numpy模块,并取别名为np
a = np.random.randn(4)  # 创建一维正态分布,4个样本
b = np.random.randn(2, 3)  # 创建二维正态分布,2行3列
c = np.random.randn(2, 3, 4)  # 创建三维正态分布,两个3行4列
print(a)
print(b)
print(c)

运行结果如下:

[-0.16930696  0.06248915  1.14694234 -0.67915553]
[[ 0.3593049   1.03306886  1.22526589]
 [ 0.61003873 -0.27869365 -1.85060132]]
[[[-1.27024862 -0.77071883  0.38358392 -0.47510941]
  [ 0.6838695  -1.17981501 -0.02296724  0.49406554]
  [ 1.3592937  -0.44472263 -1.06859185  0.45612865]]

 [[ 0.97739867  1.65453604  1.28613116  0.38836202]
  [ 0.25522913  0.06706893  0.02789549 -0.2660675 ]
  [ 0.30396508  0.92458245  0.4289461   0.47960441]]]

【示例2】创建指定方差和期望的正态分布

这里使用np.random.normal()创建指定方差和期望的正态分布

语法格式:

numpy.random.normal(loc=0.0, scale=1.0, size=None)

下面是参数说明:

import numpy as np  # 导入numpy模块,并取别名为np
a = np.random.normal(size=5)  # 默认的期望loc=0.0,方差scale=1.0
b = np.random.normal(loc=2, scale=3, size=(2, 3))  # 指定期望和方差,创建一个二维的正态分布(2行3列)
print(a)
print(b)

运行结果如下:

[-1.35319011 -0.68628191  0.64808923 -1.14593456  0.02243171]
[[ 5.58788096  6.42265409  1.89002242]
 [-3.04814133 -4.60432636  0.37355701]]


Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-2

https://developer.aliyun.com/article/1537790


相关文章
|
1月前
|
机器学习/深度学习 C语言 索引
数组计算模块NumPy(一)
NumPy是Python科学计算的核心库,提供高性能的数组和矩阵操作,支持大量数学函数。它包括一维、二维到多维数组,并通过C实现,优化了计算速度。
数组计算模块NumPy(一)
|
1月前
|
Python
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
|
29天前
|
Python
python3 入门学习笔记
python3 入门学习笔记
12 0
|
1月前
|
索引 Python
数组计算模块NumPy(二)
NumPy教程概要:介绍数组切片、二维数组索引、重塑、转置和数组操作。讨论了切片语法`[start:stop:step]`,二维数组的索引方式,以及reshape方法改变数组形状。涉及转置通过`.T`属性或`transpose()`函数实现,数组增加使用`hstack()`和`vstack()`,删除用`delete()`。还提到了矩阵运算,包括加减乘除,并展示了`numpy.dot()`和`@`运算符的使用。最后提到了排序函数`sort()`、`argsort()`和`lexsort()`,以及NumPy的统计分析函数如均值、标准差等。
|
16天前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
28 3
|
18天前
|
开发者 Python
Python元类实战:打造你的专属编程魔法,让代码随心所欲变化
【7月更文挑战第7天】Python的元类是编程的变形师,用于创建类的“类”,赋予代码在构建时的变形能力。
35 1
|
16天前
|
数据采集 大数据 数据安全/隐私保护
Python编程:如何有效等待套接字的读取与关闭
Python网络编程中,套接字事件处理至关重要。利用`selectors`模块和代理IP能增强程序的稳定性和可靠性。代码示例展示了如何通过代理连接目标服务器,注册套接字的读写事件并高效处理。在代理IP配置、连接创建、事件循环及回调函数中,实现了数据收发与连接管理,有效应对网络爬虫或聊天应用的需求,同时保护了真实IP。
Python编程:如何有效等待套接字的读取与关闭
|
7天前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
26 6
|
3天前
|
存储 算法 搜索推荐
告别低效编程!Python算法设计与分析中,时间复杂度与空间复杂度的智慧抉择!
【7月更文挑战第22天】在编程中,时间复杂度和空间复杂度是评估算法效率的关键。时间复杂度衡量执行时间随数据量增加的趋势,空间复杂度关注算法所需的内存。在实际应用中,开发者需权衡两者,根据场景选择合适算法,如快速排序(平均O(n log n),最坏O(n^2),空间复杂度O(log n)至O(n))适合大规模数据,而归并排序(稳定O(n log n),空间复杂度O(n))在内存受限或稳定性要求高时更有利。通过优化,如改进基准选择或减少复制,可平衡这两者。理解并智慧地选择算法是提升代码效率的关键。