30天拿下Python之numpy模块

简介: 30天拿下Python之numpy模块

概述

在上一节,我们介绍了Python的requests模块,包括:发送POST请求、发送GET请求、设置请求头、会话管理等内容。在这一节,我们将介绍Python的numpy模块。numpy模块是Python的一个非常重要的科学计算库,它提供了多维数组对象,以及一系列操作这些数组的函数。numpy还是许多科学计算库的基础,比如:SciPy、Pandas、Matplotlib等。

多维数组

numpy的核心功能是多维数组对象ndarray,它是一个快速、灵活的大型数据容器,可以存储单一数据类型的元素。ndarray是同质的,即:所有元素都是相同的类型,并且可以通过索引访问。多维数组可以表示一维、二维、三维甚至更高维的数据,每个维度可以有不同的长度。

可以使用numpy.array()函数从列表或元组创建多维数组,或使用numpy.zeros()、numpy.ones()等函数创建具有指定形状和类型的多维数组。

import numpy as np
# 从列表创建多维数组
a = np.array([[1, 2, 3], [66, 77, 88]])
# 输出:[[ 1  2  3] [66 77 88]]
print(a)
# 创建全部为0的多维数组
b = np.zeros((2, 3))
# 输出:[[0. 0. 0.] [0. 0. 0.]]
print(b)
 
# 创建全部为1的多维数组
c = np.ones((2, 4), dtype = np.int32)
# 输出:[[1 1 1 1] [1 1 1 1]]
print(c)


还可以使用numpy.arange()函数生成一个等差数列,类似于Python中的range()函数。该函数的语法格式为:

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

其各个参数的含义如下。

start:起始值。

stop:终止值,生成的数列中最大的元素值,不包括该值。

step:步长,两个连续元素之间的差值。

dtype:指定生成的数组的数据类型。

import numpy as np
# 生成从0到5的整数数组
a = np.arange(6)
# 输出:[0 1 2 3 4 5]
print(a)
# 生成从1开始,每次增加3,直到13的整数数组
b = np.arange(1, 13, 3)
# 输出:[ 1  4  7 10]
print(b)
 
# 生成从0开始,每次增加0.2,直到1的浮点数数组
c = np.arange(0, 1, 0.2)
# 输出:[0.  0.2 0.4 0.6 0.8]
print(c)

数组索引

在numpy模块中,可以使用方括号和逗号分隔的索引来访问多维数组中的元素。索引主要分为四种类型,分别为:整数索引、切片索引、布尔索引和花式索引。

整数索引:使用整数索引可以访问多维数组中的特定元素。比如:对于一个二维数组a,a[0, 0]将访问第一行第一列的元素。

import numpy as np
a = np.array([[1, 2, 3], [66, 77, 88]])
# 访问第一行第一列的元素,输出:1
print(a[0, 0])
# 访问第二行第三列的元素,输出:88
print(a[1, 2])


切片索引:使用切片索引可以访问多维数组中的一部分元素。比如:对于一个二维数组a,a[0, :]将访问第一行的所有元素。

import numpy as np
a = np.array([[1, 2, 3], [66, 77, 88]])
# 访问第二行的所有元素,输出:[66 77 88]
print(a[1, :])

布尔索引:使用布尔索引可以根据条件选择多维数组中的某些元素。比如 :对于一个二维数组a,a[a > 5]将选择所有大于5的元素。

import numpy as np
a = np.array([[1, 2, 3], [66, 77, 88]])
# 访问大于2的所有元素,输出:[ 3 66 77 88]
print(a[a > 2])

花式索引:使用花式索引可以根据指定的索引数组选择多维数组中的元素。比如:对于一个二维数组a,a[[0, 1], [0, 2]]将选择第一行第一列和第二行第三列的元素(第一个中括号里为元素行号,第二个中括号里为元素列号,两个括号里的元素个数必须相同)。

import numpy as np
a = np.array([[1, 2, 3], [66, 77, 88]])
# 输出:[ 1 88 77]
print(a[[0, 1, 1], [0, 2, 1]])

数组操作

numpy模块提供了大量的数组操作函数,比如:numpy.shape、numpy.reshape()、numpy.transpose()等,可以很方便地进行数组形状的改变、转置等操作。

numpy.shape属性可用于获取多维数组的形状,numpy.reshape()函数可用于改变多维数组的形状,numpy.size属性可用于获取多维数组中元素的个数。

import numpy as np
a = np.array([[1, 2, 3], [66, 77, 88]])
# 输出:(2, 3)
print(a.shape)
# 输出:6
print(a.size)
 
b = a.reshape(3, 2)
# 输出:[[ 1  2] [ 3 66] [77 88]]
print(b)
# 输出:6
print(b.size)


numpy.append()和numpy.insert()函数可用于在数组中添加元素,numpy.delete()函数可用于从数组中删除元素,numpy.where()函数可用于返回满足指定条件的元素的索引。

import numpy as np
arr = np.array([1, 2, 3])
new_arr = np.append(arr, 100)
# 在尾部添加数据,输出:[  1   2   3 100]
print(new_arr)
new_arr = np.insert(arr, 1, 100)
# 在指定位置插入数据,输出:[  1 100   2   3]
print(new_arr)
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# axis默认为None,会将数组展平到一维,并删除第二个元素,输出:[1 3 4 5 6 7 8 9]
new_arr = np.delete(arr, 1)
print(new_arr)
# 删除第二行,输出:[[1 2 3] [7 8 9]]
new_arr = np.delete(arr, 1, axis = 0)
print(new_arr)
# 删除第二列,输出:[[1 3] [4 6] [7 9]]
new_arr = np.delete(arr, 1, axis = 1)
print(new_arr)
arr = np.array([10, 20, 30, 40, 50])
indexes = np.where(arr > 20)
# 返回满足条件的索引,输出:(array([2, 3, 4], dtype=int64),)
print(indexes)
new_arr = np.where(arr > 20, 0, arr)
# 将满足条件的元素替换为0,不满足的元素保持不变,输出:[10 20  0  0  0]
print(new_arr)


numpy.sort()函数可用于对数组进行排序,numpy.concatenate()函数可用于连接多个数组。

import numpy as np
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
new_arr = np.sort(arr)
# 默认升序排列,输出:[1 1 2 3 4 5 6 9]
print(new_arr)
arr = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])
new_arr = np.sort(arr, axis = 0)
# 输出:[[3 2 1] [6 5 4] [9 8 7]]
print(new_arr)
new_arr = np.sort(arr, axis = 1)
# 输出:[[7 8 9] [4 5 6] [1 2 3]]
print(new_arr)
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
new_arr = np.concatenate((arr1, arr2))
# 合并数组,输出:[1 2 3 4 5 6]
print(new_arr)

numpy.split(array, indices_or_sections, axis=0)函数可将数组按照指定位置或数量分割成多个子数组。indices_or_sections参数为一个整数或一个表示要分割的子数组数量的元组。如果它是一个整数,则表示将数组分割成相等大小的子数组(除了最后一个可能较小)。如果它是一个元组,则表示每个子数组的大小。例如,如果输入 (3, 2, 1),则表示第一个子数组大小为3,第二个子数组大小为2,第三个子数组大小为1。

import numpy as np
array = np.arange(6)
# 将数组分割成3个子数组,每个子数组大小相等,输出如下:
# Array 1: [0 1]
# Array 2: [2 3]
# Array 3: [4 5]
subarrays = np.split(array, 3)
for i, subarray in enumerate(subarrays):
    print(f"Array {i+1}:", subarray)
# 将数组分割成2个子数组,第一个子数组包含2个元素,输出如下:
# Array 1: [0 1]
# Array 2: [2 3 4 5]
indices = (2, )
subarrays = np.split(array, indices)
for i, subarray in enumerate(subarrays):
    print(f"Array {i+1}:", subarray)

数学函数

数学函数:numpy提供了大量的数学函数,可以对数组中的元素进行各种数学运算,如numpy.sin()、numpy.cos()、numpy.exp()等。

import numpy as np
# 计算60度的余弦值
angle = np.array([60])
cos_value = np.cos(angle * np.pi / 180)
# 输出:[0.5]
print(cos_value)
 
sequence = np.array([0, 30, 45, 60, 90])
sin_sequence = np.sin(sequence * np.pi / 180)
# 输出:[0.         0.5        0.70710678 0.8660254  1.        ]
print(sin_sequence)

线性代数

线性代数:numpy还提供了一些线性代数函数,如numpy.dot()、numpy.linalg.inv()等,可以方便地进行矩阵的点积、逆矩阵等计算。

import numpy as np
 
a = np.array([1, 2, 3])  
b = np.array([4, 5, 6])  
result = np.dot(a, b)
# 计算点积,输出:32
print(result)
 
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
result = np.dot(a, b)
# 计算二维数组的点积,输出:[[19 22] [43 50]]
print(result)

随机数生成

随机数生成:numpy包含了大量的随机数生成函数,可以方便地生成各种分布的随机数。

import numpy as np
 
random_float = np.random.rand()
# 生成[0, 1)范围内的随机浮点数,输出:0.58806166392493
print(random_float)
random_integer = np.random.randint(0, 10)
# 生成[0, 10)范围内的随机整数,输出:9
print(random_integer)
random_array = np.random.rand(3)
# 生成长度为3的随机浮点数数组,数组中的数在[0, 1)范围内,输出:[0.90723285 0.05028758 0.13100614]
print(random_array)
random_array = np.random.randint(0, 100, size = 3)
# 生成长度为3的随机整数数组,数组中的数在[0, 100)范围内,输出:[59 43 90]
print(random_array)
相关文章
|
22天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
206 7
|
1月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
274 1
|
1月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
194 0
|
1月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
120 0
|
27天前
|
JSON 算法 API
Python中的json模块:从基础到进阶的实用指南
本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
229 4
|
23天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
187 0
|
24天前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
127 0
|
2月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
108 4
|
2月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
238 0
|
3月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
305 0

推荐镜像

更多