Python 中的 NumPy:数值计算基础

NumPy(Numerical Python)是一个用于科学计算的基础包。它提供了支持高效数组和矩阵操作的强大功能,同时还提供了大量的数学函数库。NumPy 是许多数据科学和机器学习库(如 Pandas、Scikit-Learn 和 TensorFlow)的基础,因此理解 NumPy 是掌握 Python 科学计算的关键。

一、NumPy 的安装与导入

在使用 NumPy 之前,需要确保已安装该库。可以使用以下命令进行安装:

sh

pip install numpy

安装完成后,可以在 Python 脚本或交互式环境中导入 NumPy:

 

import numpy as np

二、NumPy 数组

NumPy 数组(ndarray)是一个多维的同类型元素的容器。它提供了对数组元素进行高效操作的方法。

1. 数组的创建

可以通过多种方式创建 NumPy 数组,常见方法包括使用 Python 列表、NumPy 函数和读取文件等。

从列表创建数组:

 

import numpy as np # 一维数组 a = np.array([1, 2, 3]) print(a) # 输出: [1 2 3] # 二维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) print(b) # 输出: # [[1 2 3] # [4 5 6]]

使用 NumPy 函数创建数组:

 

# 创建全零数组 zeros_array = np.zeros((3, 3)) print(zeros_array) # 输出: # [[0. 0. 0.] # [0. 0. 0.] # [0. 0. 0.]] # 创建全一数组 ones_array = np.ones((2, 3)) print(ones_array) # 输出: # [[1. 1. 1.] # [1. 1. 1.]] # 创建指定值的数组 full_array = np.full((2, 2), 7) print(full_array) # 输出: # [[7 7] # [7 7]] # 创建单位矩阵 eye_array = np.eye(3) print(eye_array) # 输出: # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]] # 使用 arange 创建数组 arange_array = np.arange(0, 10, 2) print(arange_array) # 输出: [0 2 4 6 8] # 使用 linspace 创建数组 linspace_array = np.linspace(0, 1, 5) print(linspace_array) # 输出: [0. 0.25 0.5 0.75 1. ]

2. 数组属性

NumPy 数组有许多属性可以帮助我们了解数组的结构和内容。

 

a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape) # 输出: (2, 3) print(a.size) # 输出: 6 print(a.ndim) # 输出: 2 print(a.dtype) # 输出: int64 print(a.itemsize) # 输出: 8 (字节数,可能因平台不同) print(a.nbytes) # 输出: 48 (数组总字节数)

3. 数组的索引与切片

NumPy 数组支持丰富的索引和切片操作,可以方便地访问和修改数组的元素。

 

a = np.array([1, 2, 3, 4, 5]) # 索引 print(a[0]) # 输出: 1 print(a[4]) # 输出: 5 # 切片 print(a[1:3]) # 输出: [2 3] print(a[:2]) # 输出: [1 2] print(a[::2]) # 输出: [1 3 5] # 二维数组的索引与切片 b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(b[1, 2]) # 输出: 6 print(b[0:2, 1:3]) # 输出: # [[2 3] # [5 6]] # 使用布尔数组进行索引 bool_index = (a > 2) print(a[bool_index]) # 输出: [3 4 5]

4. 数组的运算

NumPy 提供了丰富的数学运算方法,可以对数组进行元素级别的运算。

 

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 基本运算 print(a + b) # 输出: [5 7 9] print(a - b) # 输出: [-3 -3 -3] print(a * b) # 输出: [ 4 10 18] print(a / b) # 输出: [0.25 0.4 0.5 ] # 数学函数 print(np.sqrt(a)) # 输出: [1. 1.41421356 1.73205081] print(np.exp(a)) # 输出: [ 2.71828183 7.3890561 20.08553692] print(np.log(a)) # 输出: [0. 0.69314718 1.09861229] # 统计函数 print(np.mean(a)) # 输出: 2.0 print(np.std(a)) # 输出: 0.816496580927726 print(np.sum(a)) # 输出: 6 print(np.prod(a)) # 输出: 6

5. 数组的形状操作

NumPy 提供了多种方法来改变数组的形状,而不改变其数据。

 

a = np.array([[1, 2, 3], [4, 5, 6]]) # 改变形状 reshaped_a = a.reshape((3, 2)) print(reshaped_a) # 输出: # [[1 2] # [3 4] # [5 6]] # 数组展平 flattened_a = a.flatten() print(flattened_a) # 输出: [1 2 3 4 5 6] # 转置 transposed_a = a.T print(transposed_a) # 输出: # [[1 4] # [2 5] # [3 6]]

6. 数组的合并与分割

NumPy 支持多种方式的数组合并与分割。

 

a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 数组合并 concatenated_ab = np.concatenate((a, b), axis=0) print(concatenated_ab) # 输出: # [[1 2] # [3 4] # [5 6] # [7 8]] stacked_ab = np.stack((a, b), axis=1) print(stacked_ab) # 输出: # [[[1 2] # [5 6]] # # [[3 4] # [7 8]]] # 数组分割 split_a = np.split(a, 2, axis=0) print(split_a) # 输出: [array([[1, 2]]), array([[3, 4]])]

7. 广播机制

NumPy 的广播机制允许不同形状的数组进行算术运算。

 

a = np.array([1, 2, 3]) b = np.array([[4], [5], [6]]) # 广播加法 print(a + b) # 输出: # [[5 6 7] # [6 7 8] # [7 8 9]]

三、NumPy 在数据科学中的应用

NumPy 是数据科学的基石,在数据处理、分析和机器学习中扮演着重要角色。

1. 数据处理

读取和写入文件

 

# 保存数组到文件 a = np.array([1, 2, 3, 4, 5]) np.save('array.npy', a) # 从文件读取数组 loaded_a = np.load('array.npy') print(loaded_a) # 输出: [1 2 3 4 5]

读取文本文件

 

# 保存到文本文件 np.savetxt('array.txt', a) # 从文本文件读取 loaded_txt_a = np.loadtxt('array.txt') print(loaded_txt_a) # 输出: [1. 2. 3. 4. 5.]

2. 数据分析

统计分析

 

data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]) # 统计数据 mean = np.mean(data) std = np.std(data) variance = np.var(data) median = np.median(data) unique_elements, counts_elements = np.unique(data, return_counts=True) print("Mean:", mean) print("Standard Deviation:", std) print("Variance:", variance) print("Median:", median) print("Unique Elements:", unique_elements) print("Counts:", counts_elements)

相关分析

 

x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 4, 6, 8, 10]) # 计算相关系数 correlation_matrix = np.corrcoef(x, y) print(correlation_matrix) # 输出: # [[1. 1.] # [1. 1.]]

3. 线性代数

NumPy 提供了丰富的线性代数操作函数,可以高效地处理矩阵运算。

 

a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 矩阵乘法 matmul_ab = np.matmul(a, b) print(matmul_ab) # 输出: # [[19 22] # [43 50]] # 计算行列式 det_a = np.linalg.det(a) print(det_a) # 输出: -2.0000000000000004 # 计算逆矩阵 inv_a = np.linalg.inv(a) print(inv_a) # 输出: # [[-2. 1. ] # [ 1.5 -0.5]] # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(a) print("Eigenvalues:", eigenvalues) print("Eigenvectors:", eigenvectors)

四、NumPy 与其他库的集成

NumPy 是许多高级数据处理和分析库的基础。了解如何与其他库集成,可以充分发挥 NumPy 的优势。

1. Pandas

Pandas 是基于 NumPy 构建的数据分析库,提供了强大的数据结构和数据分析工具。

 

import pandas as pd # 从 NumPy 数组创建 DataFrame a = np.array([[1, 2, 3], [4, 5, 6]]) df = pd.DataFrame(a, columns=['A', 'B', 'C']) print(df)

2. Matplotlib

Matplotlib 是一个 2D 绘图库,结合 NumPy 可以进行数据可视化。

 

import matplotlib.pyplot as plt # 绘制 NumPy 数组数据 x = np.linspace(0, 10, 100) y = np.sin(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('sin(x)') plt.title('Sine Wave') plt.show()

3. SciPy

SciPy 是一个科学计算库,基于 NumPy 提供更多的科学计算函数。

 

from scipy import optimize # 使用 SciPy 求解方程 def func(x): return x**2 - 4 root = optimize.root(func, 0) print(root.x) # 输出: [2.]

五、NumPy 最佳实践
  • 熟悉数组广播:理解并使用 NumPy 的广播机制,可以避免显式的循环,提高代码效率。
  • 使用矢量化操作:尽量使用 NumPy 提供的矢量化操作函数,避免使用 Python 的 for 循环。
  • 合理使用数据类型:选择合适的数据类型(如 float32 代替 float64),可以减少内存占用,提高计算速度。
  • 善用 NumPy 函数:NumPy 提供了丰富的函数库,充分利用这些函数可以简化代码,提高可读性和性能。

结论

NumPy 是 Python 科学计算的基础库,其强大的数组和矩阵处理能力以及丰富的数学函数库,使得它在数据科学、机器学习和工程计算中得到广泛应用。通过本文的介绍,读者应该能够掌握 NumPy 的基本使用方法和最佳实践,从而更高效地进行数值计算和数据处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不平衡数据研究:分配权重 合并2个loader

分配权重(基于实例分配,基于类分配) import numpy as np import torch from torch.utils.data import DataLoader, WeightedRandomSampler, Dataset# Mock dataset class class MockDataset(Dataset):def __init__(self, data, targets):sel…

玩转OpenHarmony智能家居:如何实现开发版“碰一碰”设备控制

一、简介 “碰一碰”设备控制,依托NFC短距通信协议,通过碰一碰的交互方式,将OpenAtom OpenHarmony(简称“OpenHarmony”)标准系统设备和全场景设备连接起来,解决了应用与设备之间接续慢、传输难的问题&…

什么是DDoS流量清洗?

随着互联网的飞速发展,网络安全问题日益凸显,其中分布式拒绝服务(DDoS)攻击尤为引人关注。为了有效应对这一威胁,流量清洗服务应运而生,成为网络安全领域的一项重要技术。 流量清洗服务是一种专门针对DDoS…

昔日辉煌不再,PHP老矣,尚能饭否?

导语 | 近期 TIOBE 最新指数显示,PHP 的流行度降至了历史最低,排在第 17 名,同时,在年度 Stack Overflow 开发者调查报告中,PHP 在开发者中的受欢迎程度已经从之前的约 30% 萎缩至现在的 18%。“PHP 是世界上最好的语言…

WiFi蓝牙模块开发配置过程中需要注意的细节

在很多产品的应用场景中,WIFI网络会给我们提供很多便捷,MCU开发中大多使用串口WIFI蓝牙模块来实现产品接入WIFI网络中。   具体的使用模型如下图所示:整个系统涉及到WIFI网络、手机、服务器平台以及我们设计的产品,一个完整的生…

Docker技术搭建Grafana监控平台

centos7虚拟机和docker的安装:可以参考之前的博文 CPU、mysql-exporter、docker监控模板:百度网盘 提取码:0000 先查看服务器时间是否和当前时间一致,如果不一致,查看对应设置:centos7时间同步博文 一、…

拆分盘投资深度解析:投资逻辑、风险探讨与投资建议

随着互联网技术的飞速发展,金融领域也迎来了诸多创新。其中,拆分盘作为一种新型投资模式,以其独特的“只涨不跌”机制,吸引了众多投资者的目光。本文将深入探讨拆分盘的投资逻辑,并通过一个实际案例进行解析&#xff0…

BUUCTF [GUET-CTF2019]zips 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 得到一个attachment.zip文件 解题思路: 1、解压attachment.zip,得到222.zip文件。尝试解压需要密码,使用Ziperello爆破密码…

Elementui里使用el-date-picker来选择多个日期(日期数量不超过31个)

<el-date-picker style"width:350px;"v-model"selectedDates" type"dates" :picker-options"pickerOptionsMul" placeholder"选择日期"> </el-date-picker>data(){return{selectedDates: [],pickerOptionsMul: …

CATIA入门操作——萌新宝宝遇到的奇奇怪怪的问题解决,持续更新中。。。

目录 引出发生肾么事了&#xff1f;&#xff1f;鼠标中键旋转不了解决&#xff1a;特征树不显示参数关系 我的窗口去哪了&#xff1f;插曲&#xff1a;草图工具的调出插曲&#xff1a;颜色工具栏显示 弹窗警告警告&#xff1a;创建约束是临时的 操作技巧技巧&#xff1a;快速隐…

unity 常用工具和代码

GitHub - edcasillas/unity-missing-references-finder: A tool to find missing references in Unity ASE MagicaCloth PostProcessing GPU culling AmplifyColor Bakery

Unity功能——设置图片渐显渐掩

两种方式&#xff1a; 本质都是 根据时间修改图片透明度 达到动态显示或掩藏图片的效果 1、监测图片透明度&#xff0c;根据图片透明度值来显示或掩藏图片&#xff1b; 2、监测时间&#xff0c;根据时间长短来显示或掩藏图片&#xff1b; 可根据项目需求进行选择和细节修改。 …

微软必应全球宕机事件分析及其对ChatGPT、Copilot等服务的影响

微软必应全球宕机事件分析及其对ChatGPT、Copilot等服务的影响 一、引言 在数字化时代&#xff0c;云计算和在线服务已成为人们日常生活和工作不可或缺的一部分。然而&#xff0c;当这些服务遭遇故障或宕机时&#xff0c;其影响范围往往远超出人们的想象。近期&#xff0c;微…

Bytebase 2.17.0 - 支持为工单设置标签

&#x1f680; 新功能 支持为工单设置标签。 支持显示工单任务执行日志&#xff0c;如影响行数或错误&#xff08;支持 MySQL 和 PostgreSQL&#xff09;。 支持在数据库页面为表或列配置分类分级。之前的版本需要通过 DDL 实现&#xff0c;且只支持 MySQL 和 PostgreSQL。…

C语言从头学11——运算符优先级

前面曾提及多使用圆括号来回避运算符优先级的问题&#xff0c;这里还是大致介绍一下运算符优先级的主要内容。优先级是指如果一个表达式包含多个运算符&#xff0c;哪个运算符优先执行的顺序问题。各种运算符的优先级是不一样的。下面是部分常用运算符的优先级顺序(从高到低)&a…

【传知代码】Modnet 人像抠图-论文复现

文章目录 概述原理介绍核心逻辑ModNet 的结构 环境配置WebUI 小结 论文地址 论文GitHub 本文涉及的源码可从Modnet 人像抠图该文章下方附件获取 概述 人像抠图技术在多个领域有着广泛的应用场景&#xff0c;包括但不限于&#xff1a; 展馆互动拍照&#xff1a;展馆中使用的抠…

【高阶数据结构】 B树 -- 详解

一、常见的搜索结构 适合做内查找&#xff1a; 以上结构适合用于数据量相对不是很大&#xff0c;能够一次性存放在内存中&#xff0c;进行数据查找的场景。如果数据量很大&#xff0c;比如有 100G 数据&#xff0c;无法一次放进内存中&#xff0c;那就只能放在磁盘上了。 如果…

计算机系统基础 8 循环程序

概要 两种实现方法——分支指令实现和专门的循环语句实现以及有关循环的优化。 分支指令实现 倒计数 …… MOV ECX&#xff0c;循环次数 LOOPA&#xff1a;…… …… DEC ECX JNE LOOPA 正计数 …… MOV ECX&#xff0c;0 LOOPA&#xff1a; …… INC ECX CMP …

向郭老师学习研发项目管理

学习研发项目管理思路 通过以下思路来学习研发项目管理&#xff1a; 1、研发项目管理分3级 2、研发项目管理分4类 3、研发项目管理分5大过程组 4、新产品开发项目生命周期分6个阶段 5、研发项目管理分10大知识体系 项目组合、项目集、简单项目3级管理 针对Portfolio组合…