深入理解NumPy库:常用函数详解与数组操作指南

     在数据科学和数值计算领域,NumPy无疑是一个强大的工具,它为Python提供了高效的多维数

组处理能力。无论是进行数据分析、构建机器学习模型,还是进行复杂的科学计算,NumPy都是

不可或缺的核心库之一。

        numpy.array 是 NumPy 库中的一个基本对象,它提供了一个多维数组对象,可以用来存储

同类型数据的集合

        NumPy 是 Python 中进行科学计算的基础库之一,它提供了大量的数值计算功能。

1. 数据结构

        numpy.array 是一个多维数组,它由元素(通常是数字)组成,这些元素在内存中是连续存

的。

        数组可以是任意维度的,例如一维数组(向量)、二维数组(矩阵)、三维数组等。

2. 类型

        NumPy 数组中的所有元素必须是同一类型,例如整数、浮点数、复数等。

        数组的数据类型可以通过 dtype 属性来查看,例如 int32、float64、complex128 等。

3. 属性

        ndim:数组的维度。

        shape:数组的形状,即每个维度的大小。

        size:数组中元素的总数。

        dtype:数组元素的数据类型。

4. 创建数组

        可以通过传递一个 Python 列表(或其它可迭代对象)给 numpy.array 来创建一个数组。

        可以指定数组的 dtype,如果不指定,NumPy 会根据输入数据的类型自动推断。

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

运行结果 

为什么要使用 numpy.array?

        1. 性能

        NumPy 数组在执行数学运算时比 Python 内置的列表要快得多,因为 NumPy 的操作是在底

层执行的,这些底层是用 C 语言写的。

        2. 功能

        NumPy 提供了大量方便的数学函数和线性代数运算功能,可以直接在数组上使用。

        3. 内存效率

        NumPy 数组在存储数据时比 Python 列表更加紧凑,特别是对于大型数据集。

        4. 广播

        NumPy 支持广播规则,这使得在不同形状的数组之间进行操作成为可能,而无需显式地扩展

它们的大小。

        numpy.zeros 是 NumPy 库中的一个函数,它用于创建一个指定形状和数据类型的新数组,

并将其所有元素初始化为 0

        1. 用途

        numpy.zeros 用于创建一个零矩阵或零向量,这在初始化数据结构、创建占位符数组等场景

中非常有用。

        2. 参数

        shape:一个整数或整数元组,指定输出数组的形状。例如,5 表示一维数组,(2, 3) 表示二

维数组,其中有 2 行 3 列。

        dtype:可选参数,指定数组元素的数据类型默认是 float,即 float64。

        order:可选参数,指定数组数据在内存中的存储顺序,可以是 'C'(按行,C-style)或

'F'(按列,Fortran-style)。默认是 'C'。

import numpy as np# 创建一个一维数组,5个元素,数据类型默认为float64x = np.zeros(5)# 创建一个二维数组,2行3列,数据类型为整型y = np.zeros((2, 3), dtype=int)# 创建一个三维数组,2页3行4列,数据类型为float32z = np.zeros((2, 3, 4), dtype=np.float32)print(x, y, z)  # 打印结果

运行结果

        注意事项

        如果 shape 参数是一个整数,numpy.zeros 会创建一个一维数组。

        如果 shape 参数是一个元组,numpy.zeros 会创建一个多维数组,其形状与元组中的值相对

应。

        如果 dtype 参数未指定,默认创建的数组元素类型是 float64。

        numpy.zeros 创建的数组元素总是填充为 0,如果需要填充其他值,可以使用 numpy.ones

(填充为 1)或 numpy.full(填充为指定值)。

        numpy.ones 是 NumPy 库中的一个函数,用于创建一个指定形状和数据类型的新数组,并

将其所有元素初始化为 1。

        1. 用途

        numpy.ones 用于创建一个元素全部为 1 的矩阵或向量,这在初始化权重矩阵、创建单位矩阵

等场景中非常有用。

        2. 参数

        shape:一个整数或整数元组,指定输出数组的形状

        dtype:可选参数,指定数组元素的数据类型。默认是 float,即 float64。

        order:可选参数,指定数组数据在内存中的存储顺序,可以是 'C'(按行,C-style)

或 'F'(按列,Fortran-style)。默认是 'C'。

import numpy as npones_arr = np.ones((2, 3))  # 创建一个2行3列的二维数组,并将所有元素都初始化为1print(ones_arr)  # 打印结果

运行结果

        numpy.empty 是 NumPy 库中的一个函数,用于创建一个指定形状的新数组,但不初始化其

元素。这意味着数组中的元素将包含内存中的随机值

        1. 用途

        numpy.empty 用于创建一个未初始化的数组,其元素值是未定义的

        当性能至关重要且不需要预先填充数据时,使用 numpy.empty 可以节省初始化数组的时间。

        2. 参数

        shape:一个整数或整数元组,指定输出数组的形状。

        dtype:可选参数,指定数组元素的数据类型。默认是 float,即 float64。

        order:可选参数,指定数组数据在内存中的存储顺序,可以是 'C' 或 'F'。默认是 'C'。

import numpy as npempty_arr = np.empty((2, 3))  # 创建一个 2 行 3 列的二维数组,其元素包含内存中的随机值print(empty_arr)  # 打印结果

运行结果

注意事项

        numpy.empty 不会初始化数组元素,因此数组中的值是未定义的,可能是任何值。

        使用 numpy.empty 时,应该立即用有效的数据填充数组,以避免在后续的计算中出现不可预

测的结果。

        numpy.empty 通常用于创建大型数组,并且当数组将被立即填充时使用,以节省初始化时

间。

        numpy.arange 是 NumPy 库中的一个函数,用于创建一个一维数组,数组元素是在给定间隔

内的均匀间隔的值。

        1. 用途

        numpy.arange 用于生成一系列数字类似于 Python 内置的 range 函数,但它返回的是一个

NumPy 数组

        2. 参数

        start:可选参数,序列的起始值,默认为 0。

        stop:序列的结束值,生成的序列不包括此值。

        step:可选参数,序列中的步长,默认为 1。

        dtype:可选参数,指定返回数组的数据类型。

import numpy as nprange_arr = np.arange(10)print(range_arr)  # 打印结果

运行结果

        numpy.linspace 是 NumPy 库中的一个函数,用于创建一个一维数组,数组元素在指定的起

始值和结束值之间均匀分布。

        1. 用途

        numpy.linspace 用于在指定的起始值和结束值之间生成指定数量的均匀间隔的样本

        2. 参数

        start:序列的起始值。

        stop:序列的结束值。

        num:生成的样本数量,默认为 50。如果 num 是 1,则返回 start 和 stop 之间的单个值。

        endpoint:可选参数,如果为 True,则 stop 是最后一个样本。默认为 True。

        retstep:可选参数,如果为 True,则返回样本和步长。

import numpy as nplin_space_arr = np.linspace(0, 10, num=5)  # linspace_arr 是一个包含 5 个元素的数组,这些元素在 0 到 10 之间均匀分布。print(lin_space_arr)    # 打印输出结果

运行结果

        

        numpy.logspace 是 NumPy 库中的一个函数,用于创建一个一维数组,数组元素在指定的

起始值和结束值之间按对数刻度均匀分布

1. 用途

   numpy.logspace 用于在指定的起始值和结束值之间生成指定数量的对数刻度上的均匀间隔的样本。

2. 参数

   start:起始值的对数值。

   stop:结束值的对数值。

   num:生成的样本数量。

   endpoint:可选参数,如果为 True,则 stop 是最后一个样本。

   base:对数的底数,默认为 10。

   dtype:可选参数,指定返回数组的数据类型。

import numpy as nplogspace_arr = np.logspace(0, 10, num=5, base=10)    # logspace_arr 是一个包含 5 个元素的数组,这些元素在 10^0 到 10^10 之间按对数刻度均匀分布。# 默认情况下 base 参数是 10,所以这里实际上是从 1 到 10^10。print(logspace_arr)    # 打印结果

运行结果

        numpy.shape 返回一个表示数组维度的元组。

        用途:获取数组的维度信息,这对于理解数据的结构非常重要。

        工作原理:它不改变数组本身,而是提供了一个元组,元组中的每个元素对应数组在该维度

上的大小。

import numpy as nparr_1 = np.array([1, 2, 3, 4, 5])arr_2 = np.array([4, 5, 6, 7, 8, 9])print(arr_1.shape)  # 打印数组的形状,即每个维度的大小

运行结果

        numpy.reshape 改变数组的形状而不改变其数据。

        用途:当你需要改变数组的维度以适应不同的计算需求时,reshape 非常有用。

        工作原理:它返回一个新的数组对象,其数据与原始数组相同,但形状不同。

        如果新形状的总大小与原始数组相同,则操作成功;否则,会抛出错误。

import numpy as nparr_1 = np.array([1, 2, 3, 4, 5])arr_2 = np.array([4, 5, 6, 7, 8, 9])print(arr_1.shape)  # 打印数组的形状,即每个维度的大小print(arr_2.reshape((2, 3)))

运行结果

        numpy.resize 改变数组的大小,必要时会重复或截断数据。

        用途:当你需要一个具有特定大小的新数组,并且不介意填充或丢失数据时

        工作原理:如果新大小大于原始大小,它会重复原始数组中的数据以填充新数组。

        如果新大小小于原始大小,它将截断数据。

import numpy as nparr_1 = np.array([1, 2, 3, 4, 5])arr_2 = np.array([4, 5, 6, 7, 8, 9])print(arr_1.shape)  # 打印数组的形状,即每个维度的大小print(arr_2.reshape((2, 3)))print(np.resize(arr_2, (3, 3)))

运行结果

        numpy.flatten 将多维数组转换为一维数组。

        用途:当你需要将多维数据简化为一维数据时。

        工作原理:它返回一个一维数组,该数组按C风格顺序(行优先)展开原始数组的元素

import numpy as nparr_1 = np.array([1, 2, 3, 4, 5])arr_2 = np.array([4, 5, 6, 7, 8, 9])print(arr_1.shape)  # 打印数组的形状,即每个维度的大小print(arr_2.reshape((2, 3)))arr_3 = np.resize(arr_2, (3, 3))print(arr_3.flatten())

运行结果

        

        numpy.concatenate 沿现有轴连接两个或多个数组。

        用途:当你需要将多个数组沿某个轴合并时。

        工作原理:它接受一个元组或列表作为输入,其中包含要连接的数组,以及一个可选的 axis

参数,指定连接的轴。

        示例:如果 arr1 和 arr2 都是长度为 3 的一维数组,np.concatenate((arr1, arr2)) 将返回一个

长度为 6 的新数组。       

        numpy.stack 沿新轴连接两个或多个数组。       

        用途:当你需要创建一个新的维度来组合多个数组时。

        工作原理:与 concatenate 不同,stack 创建一个新的轴,所有输入数组都沿着这个新轴堆

叠。

        示例:如果 arr1 和 arr2 都是长度为 3 的一维数组,np.stack((arr1, arr2), axis=0) 将返回一个

2x3 的二维数组。       

        numpy.split 将一个数组分割成多个子数组。       

        用途:当你需要根据指定的索引将数组分割成多个部分时。

        工作原理:它接受一个数组和一个索引列表,根据这些索引将数组分割成多个子数组。

        索引指定了分割点。

        示例:如果 arr 是一个长度为 6 的一维数组,np.split(arr, [2, 4]) 将返回三个子数组,分别包

含前两个元素、接下来的两个元素和最后两个元素。       

        numpy.sort 对数组进行排序。      

        用途:当你需要对数组中的元素进行排序时。

        工作原理:它返回数组的排序副本,原始数组保持不变。可以指定排序的轴,默认情况下,

一维数组沿着 0 轴排序。

        示例:如果 arr 是一个未排序的数组,np.sort(arr) 将返回一个排序后的数组。

备注

1.   dtype 属性确定和识别存储的数据类型的理解

        在 NumPy 库中,每个数组都有一个与之关联的数据类型,称为  dtype (数据类型)。

        这个  dtype  属性告诉我们数组中的元素属于哪种数据类型,例如整数、浮点数、复数等,以

及这些数据类型占用的内存大小。

数据类型

        int32:表示数组中的元素是32位整数。

        这意味着每个整数元素占用32位的内存空间,能够表示的整数范围是从 2^31 到 2^31  1。

        float64:表示数组中的元素是64位浮点数,也称为双精度浮点数。

        每个浮点数元素占用64位的内存空间,能够表示非常大或非常小的数值,以及很高的数值精

度。
        complex128:表示数组中的元素是128位复数。

        每个复数元素由两个64位浮点数组成,分别表示复数的实部和虚部。

import numpy as np# 创建一个整数类型的数组array_int = np.array([1, 2, 3])print(array_int.dtype)  # 输出# 创建一个浮点类型的数组array_float = np.array([1.0, 2.0, 3.0])print(array_float.dtype)  # 输出# 创建一个复数类型的数组array_complex = np.array([1+2j, 3+4j])print(array_complex.dtype)  # 输出

2. 对数组形状的理解

数组形状的定义

        数组的形状指的是数组在每个维度上的大小

        简单来说,它描述了数组是如何排列和组织的。

维度和形状

        一维数组:只有一个维度,形状是一个数字,表示数组中元素的数量。

        二维数组:有两个维度,形状是两个数字的元组,分别表示行数和列数。

        三维数组:有三个维度,形状是三个数字的元组,可以理解为一系列的“页”,每一页是一个二

维数组。

        更高维数组:以此类推,每个额外的维度都会增加一个数字到形状元组中。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

UART通信—基于江科大源码基础进行的改进和解析

我就不讲理论了,CSDN上大佬属实多,我就只讲代码了,串口的基本理论,大家去看其他大佬写的吧 一、源文件的组成 1、包含的头文件 stm32f10x.h 是STM32F10x系列微控制器的标准外设库(Standard Peripheral Library&…

【算法业务】数据驱动的用户增长实践、收益及思考

这篇内容是多年之前(2020年)的用户增长项目时自己写的总结,这里做一下对于实践和思考的回顾,便于知识的记录和经验分享,内容涉及用户增长理解、个性化推送系统框架、个性化推送问题建模、推送内容池构建、智能文案生成…

zotero使用koofr+google drive/onedrive同步

最早了解到这个思路是来自 知乎-【从零开始使用Zotero】(3) Zotero文献同步方式 和 How to Sync Zotero Files Using WebDAV and Google Drive with Koofr: A Step-by-Step Guide 虽然周围很多人都在用Readpaper这种web端的了,但是经常逛Arxiv而且zotero的web插…

MATLAB|电气互联系统有功-无功协同优化模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 下载链接 1 主要内容 本程序基本复现《“碳中和”目标下电气互联系统有功-无功协同优化模型》,文献模型提供了一个很好的创新思路,把常规电气互联系统的调度和有功无功优化…

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多,因此拆成2个章节,本章节是第一章节&…

10.4学习

1.Transactional 注意事项: ①事务函数中不要处理耗时任务,会导致长期占有数据库连接。 ②事务函数中不要处理无关业务,防止产生异常导致事务回滚。 ●事务传播属性 ①REQUIRED(默认属性) 如果存在一个事务&#…

基于Springboot+VUE的二手奢侈品商城的设计与实现

一、摘要 当前,二手奢侈品市场持续蓬勃发展,吸引了越来越多的消费者。然而,现有的二手奢侈品交易平台在用户体验、安全性和功能方面仍存在一些问题,需要进一步改进。本研究旨在设计和实现一种基于Spring Boot 和 Vue 技术框架的二…

17 链表——21. 合并两个有序链表 ★

17 链表 21. 合并两个有序链表 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 算法设计: 合并两个有序链表,并保持有序性,可以采用迭代法和递归法两种…

Unity代码组件,代码控制旋转+RotateAround、Translate,LookAt相关

创建脚本 在Project面板创建一个Scripts文件夹,用于专门存放脚本,创建一个脚本,命名为RotationControl,将该脚本拖拽到Tank上,则Tank物体成功挂载该脚本。 双击打开脚本,编写脚本如下: using System.Coll…

国外电商系统开发-运维系统批量添加服务器

您可以把您准备的txt文件,安装要求的格式,复制粘贴到里面就可以了。注意格式! 如果是“#” 开头的,则表示注释!

746. 使用最小花费爬楼梯

文章目录 746. 使用最小花费爬楼梯思路总结 746. 使用最小花费爬楼梯 746. 使用最小花费爬楼梯 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标…

Java之队列

1. 概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性 特点: 队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进…

【论文笔记】DKTNet: Dual-Key Transformer Network for small object detection

【引用格式】:Xu S, Gu J, Hua Y, et al. Dktnet: dual-key transformer network for small object detection[J]. Neurocomputing, 2023, 525: 29-41. 【网址】:https://cczuyiliu.github.io/pdf/DKTNet%20Dual-Key%20Transformer%20Network%20for%20s…

等额本金和等额本息是什么意思?

等额本金和等额本息是两种常见的贷款还款方式,它们各自有着不同的特点和适用场景。下面我将用通俗易懂的语言来解释这两种还款方式: 等额本金 定义:等额本金指的是在贷款期限内,每月偿还相同数额的本金,而利息则随着剩…

buuctf[安洵杯 2019]easy misc1

解压的一个文件夹和图片一个,zip压缩包有密码 FLAG IN ((√2524921X8552)15-1794)NNULLULL, ((√2524921X8552)15-1794)7 我用passware kit 2022 所以试试7位数字NNULLULL,掩码(mask)攻击试试 mask :?d?d?d?d?d?d?dNNUL…

C++【类和对象】(友元、内部类与匿名对象)

文章目录 1.友元2.内部类3.匿名对象结语 1.友元 友元提供了⼀种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类声明的前面加friend,并且把友元声明放到⼀个类的里面。外部友元函数可访问类的私有和保护…

图文深入理解Oracle DB企业级集中管理神器-GC

值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。今天继续宅继续写。 本文将图文深入介绍Oracle DB企业级集中管理神器-GC:即Oracle Grid Control(Oracle 企业管理器网格控制)。 Oracle DB的牛逼之处实在太…

GS-SLAM论文阅读笔记-CaRtGS

前言 这篇文章看起来有点像Photo-slam的续作,行文格式和图片类型很接近,而且貌似是出自同一所学校的,所以推测可能是Photo-slam的优化与改进方法,接下来具体看看改进了哪些地方。 文章目录 前言1.背景介绍GS-SLAM方法总结 2.关键…

基于Keras的U-Net模型在图像分割与计数中的应用

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色&a…

【C++算法】10.滑动窗口_长度最小的子数组

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 209. 长度最小的子数组 题目描述: 解法 解法一:暴力求解(会超时) 暴力枚举出所有子数组的和。 查找子数组n2&#xff0…