当前位置: 首页 > news >正文

NumPy 核心指南:零基础入门与实践

NumPy 简介

NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的多维数组及矩阵运算,此外也针对数组运算提供大量的数学函数库。

发展历史

NumPy 的前身 Numeric 早在 1995 年就诞生了,后来在 2005 年,Travis Oliphant 在 Numeric 的基础上创建了 NumPy,增加了对不同类型数据的支持等功能,使其成为目前 Python 数据科学领域中最重要、最基础的库之一。

重要地位

NumPy 是许多其他 Python 科学计算库(如 SciPy、Pandas、Matplotlib 等)的基础,它高效地处理多维数组的能力,让数据处理变得快捷而方便,为数据分析、机器学习等众多领域提供了强大的支持。

NumPy 数组基础

数组创建

一维数组
import numpy as nparr = np.array([1, 2, 3, 4])print(arr)print(type(arr)) # <class 'numpy.ndarray'>

运行结果为:[1 2 3 4],输出的类型表明这是一个 NumPy 的多维数组对象(ndarray)。

二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(arr2)

输出:

[[1 2 3][4 5 6]]
三维数组
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])print(arr3)

输出:

[[[1 2][3 4]][[5 6][7 8]]]

数组属性

ndim

表示数组的维度。

print(arr.ndim) # 1print(arr2.ndim) # 2print(arr3.ndim) # 3
shape

表示数组形状,即每个维度的大小。

print(arr.shape) # (4,)print(arr2.shape) # (2, 3)print(arr3.shape) # (2, 2, 2)
dtype

表示数组中元素的数据类型。

print(arr.dtype) # int64,具体类型可能因系统环境有所不同arr4 = np.array([1.0, 2.0, 3.0])print(arr4.dtype) # float64
size

表示数组元素个数。

print(arr.size) # 4print(arr2.size) # 6print(arr3.size) # 8

数组操作

切片与索引

一维数组索引和切片
arr = np.array([1, 2, 3, 4, 5])print(arr[0]) # 1,取索引为 0 的元素print(arr[1:4]) # [2 3 4],取索引 1 到 3 的元素
二维数组索引
arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(arr2[1, 2]) # 6,取第二行第三列元素# 取第一行的所有元素print(arr2[0, :]) # [1 2 3]# 取所有行的第二列元素print(arr2[:, 1]) # [2 5]

重塑数组

arr = np.array([1, 2, 3, 4, 5, 6])arr2 = arr.reshape(2, 3)print(arr2)

输出:

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

还可以将一维数组重塑为三维数组:

arr3 = arr.reshape(2, 1, 3)print(arr3)

输出:

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

拼接与拆分数组

拼接数组
arr1 = np.array([1, 2, 3])arr2 = np.array([4, 5, 6])arr3 = np.concatenate((arr1, arr2))print(arr3) # [1 2 3 4 5 6]# 沿不同轴拼接二维数组arr4 = np.array([[1, 2], [3, 4]])arr5 = np.array([[5, 6], [7, 8]])arr6 = np.concatenate((arr4, arr5), axis=0) # 沿行(轴 0)拼接print(arr6)

输出:

[[1 2][3 4][5 6][7 8]]
arr7 = np.concatenate((arr4, arr5), axis=1) # 沿列(轴 1)拼接print(arr7)

输出:

[[1 2 5 6][3 4 7 8]]
拆分数组
arr = np.array([1, 2, 3, 4, 5, 6])arr1, arr2, arr3 = np.split(arr, 3) # 将数组平均拆分为 3 部分print(arr1) # [1 2]print(arr2) # [3 4]print(arr3) # [5 6]# 指定拆分位置arr4, arr5 = np.split(arr, [2]) # 在索引 2 处拆分print(arr4) # [1 2]print(arr5) # [3 4 5 6]

数组运算

矢量化运算

arr1 = np.array([1, 2, 3])arr2 = np.array([4, 5, 6])print(arr1 + arr2) # [5 7 9]print(arr1 - arr2) # [-3 -3 -3]print(arr1 * arr2) # [4 10 18]print(arr1 / arr2) # [0.25 0.4 0.5]

广播机制

arr = np.array([1, 2, 3])print(arr + 2) # [3 4 5]arr2 = np.array([[1, 2, 3], [4, 5, 6]])print(arr2 + arr) # [[2 4 6][5 7 9]]

数组与矩阵运算

arr1 = np.array([1, 2, 3])arr2 = np.array([4, 5, 6])print(arr1.dot(arr2)) # 32,点积运算arr3 = np.array([[1, 2, 3], [4, 5, 6]])print(arr3.T) # [[1 4][2 5][3 6]],矩阵转置

NumPy 与 Python 列表的比较

内存效率示例

创建一个包含 1000 万个元素的列表和 NumPy 数组来比较内存占用。

import syslist_data = list(range(10000000))numpy_data = np.arange(10000000)print(sys.getsizeof(list_data) * len(list_data)) # 列表内存占用(字节)print(numpy_data.nbytes) # NumPy 数组内存占用(字节)

通常 NumPy 数组会比列表节省大量内存。

性能优势示例

对两个各含 1000 万个元素的列表和 NumPy 数组分别进行加法运算比较耗时。

import timelist1 = list(range(10000000))list2 = list(range(10000000))start_time = time.time()list_result = [x + y for x, y in zip(list1, list2)]list_time = time.time() - start_timenumpy1 = np.array(list1)numpy2 = np.array(list2)start_time = time.time()numpy_result = numpy1 + numpy2numpy_time = time.time() - start_timeprint(f"列表运算耗时:{list_time}")print(f"NumPy 数组运算耗时:{numpy_time}")

NumPy 数组运算通常会比列表循环快一两个数量级。

功能丰富示例

NumPy 提供大量的数学函数,比如计算数组的平方根等。

arr = np.array([1, 4, 9, 16])print(np.sqrt(arr)) # [1. 2. 3. 4.]

而对 Python 列表进行同样的操作需要循环结合数学函数来实现。

NumPy 高级功能

布尔索引

arr = np.array([1, 2, 3, 4, 5])bool_arr = arr > 2print(bool_arr) # [False False True True True]print(arr[bool_arr]) # [3 4 5]# 更常用的写法print(arr[arr > 2]) # [3 4 5]

随机数生成

# 生成随机整数arr = np.random.randint(0, 10, (2, 3))print(arr)# 生成随机浮点数数组arr_float = np.random.rand(3, 4) # 生成形状为(3,4)的浮点数数组,数值范围在[0,1)print(arr_float)# 生成符合正态分布的随机数数组arr_normal = np.random.randn(2, 2) # 均值为0,方差为1的正态分布print(arr_normal)

统计分析


arr = np.array([[1, 2, 3], [4, 5, 6]])print(np.mean(arr)) # 3.5,整个数组的均值print(np.mean(arr, axis=0)) # [2.5 3.5 4.5],按列求均值print(np.mean(arr, axis=1)) # [2. 5.],按行求均值print(np.median(arr)) # 3.5,中位数print(np.std(arr)) # 标准差

文件读写

保存和加载 .npy 文件
arr = np.array([1, 2, 3])np.save('arr.npy', arr)loaded_arr = np.load('arr.npy')print(loaded_arr)
文本文件读写
# 假设有一个文本文件 data.txt,内容如下:# 1 2 3# 4 5 6# 7 8 9arr = np.loadtxt('data.txt')print(arr)# 将数组保存为文本文件np.savetxt('new_data.txt', arr)

通过以上详细介绍,初学者可以从基础到高级全面了解 NumPy 的知识和用法,为进一步学习数据分析等相关领域打下坚实基础。

以上内容全面介绍了 NumPy 的常用知识。你若觉得某些部分需要更详细的解释,或想补充其他相关内容,欢迎随时告知。

http://www.xdnf.cn/news/33661.html

相关文章:

  • 商标起名换了暗示词,通过初审!
  • 边生成边训练:构建合成数据驱动的在线训练系统设计实战
  • XMind 下载指南
  • 基于autoware.1.14与gazebo联合仿真进行全局规划高精地图版
  • 可穿戴经颅多通道直流电刺激产品测试总结
  • 16、堆基础知识点和priority_queue的模拟实现
  • 为什么 waitress 不支持 WebSocket?
  • PyTorch源码编译报错“fatal error: numpy/arrayobject.h: No such file or directory”
  • SEO长尾关键词优化实战
  • velocity模板引擎
  • 【一起学Rust】使用Thunk工具链实现Rust应用对Windows XP/7的兼容性适配实战
  • RoBoflow数据集的介绍
  • JVM笔记【一】java和Tomcat类加载机制
  • PHP怎样连接MySQL数据库?
  • 基于STM32中断讲解
  • 【JDBC-54.5】JDBC批处理插入数据:大幅提升数据库操作性能
  • YOLO拓展-NMS算法
  • GWAS_LD
  • TCP 总是禁用分片(IP_DF,Don‘t Fragment)吗?
  • 基于尚硅谷FreeRTOS视频笔记——9—上下文切换的时机与空闲任务
  • 第10期:Classifier-Free Guidance(CFG)——扩散模型的文本引导增强术
  • pycharm中怎么解决系统cuda版本高于pytorch可以支持的版本的问题?
  • Python 一等函数( 把函数视作对象)
  • 指针----------C语言经典题目(2)
  • 【Docker项目实战】使用Docker部署NotepadMX笔记本工具
  • Feign:调用方与被调用方集成的对比及Feign继承的应用
  • C语言内存管理
  • 6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写
  • 发动机悬置橡胶弹性体试验机
  • Dify快速入门之chatflow