NumPy教程(一)—— ndarray:多维数组对象

前言

该numpy学习笔记参考了菜鸟教程网、b站up主 孙兴华zz 《孙兴华中文讲python数据分析三部曲》以及《北理-python数据分析与展示》,课本推荐使用《利用python进行数据分析》

  • Numpy简介:

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

1.数组(array)的介绍

       数组是相同数据类型的集合,多个变量共用一个变量名称,并用下标加以区分

  • 数组和列表

       数组和列表都是表达一组数据的有序结构的数据类型,但列表中的数据类型可以不同,数组中的数据类型必须相同

  • 数组和矩阵

        矩阵(matrix)是数组(array)的一个分支,很多时候二者是通用的,但建议选择数组,更灵活。一般,二维的array也翻译成矩阵 

一维、二维、三维数组

  • N维数组对象:ndarray 

      ndarray是一个多维数组对象,由两部分构成:实际的数据以及描述这些数据的元数据(如:维度、类型),

      ndarray数组一般要求所有元素类型相同(因为一般同一维度中,数据类型基本相同,便于计算),数组下标从0开始

      优点:可以省去循环,使一维向量更像单个数据;底层实现通过c语言完成,提升计算速度

# 两种数组相加方式对比

# 利用for循环和列表相加两个数组
def shuzujiafa1(n):
    a = [i**3 for i in range(1,n+1)]
    b = [i**2 for i in range(1,n+1)]
    c = []
    for i in range(n):
        c.append(a[i]+b[i])
    return c
print(shuzujiafa1(3))

# 利用numpy库相加两个数组
import numpy as np
def shuzujiafa2(n):
    a = np.arange(1,n+1) ** 3
    b = np.arange(1,n+1) ** 2
    return a+b
print(shuzujiafa2(3))

2.ndarray对象的属性

属性说明
n.ndim返回ndarray对象的秩,即轴的数量或维度
n.shape返回一个元组,表ndarray对象的形状 (几行几列)
n.size返回ndarray对象中元素的个数
n.dtype返回ndarray对象中所有元素的数据类型
n.itemsize返回ndarray对象中每个元素的大小,以字节为单位

3.数组的创建方式

numpy每一次生成的数组中都要把元素作为浮点数(除了arrange函数),因为在科学计算中会大量用到浮点数 

 3.1 常规创建(从列表、元组等类型创建)

  语法np.array( 列表 或 元组 或 数组等 ,dtype = xxx)   

            其中列表可以用 range(a,b)代替,dtype是设置数组内对象的数据类型,默认自动识别

           

  

 3.2 使用函数创建特定数组

  •  常规函数 
函数说明
np.ones(shape)

根据shape生成一个全1数组,shape是元组或整数类型

例:np.ones((2,3))一>  生成两行三列的全为1的元组

np.zeros(shape)根据shape生成一个全0数组,shape是元组或整数类型(同上)
np.full ( shape,value )
根据shape生成一个数组,每个元素值都是value
np.eye(n)
创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.empty(shape)根据shape生成一个空数组(一般用于初始化)

  • like类函数:根据已有数组创建新数组
函数说明

np.ones_like(a)

相当于把shape换成了数组a,根据数组a的形状生成想要的数组

即:数组a的shape就是新数组的shape

np.zeros_like(a)
np.empty_like(a)
np.full_like(a,value)
np.concatenate((a,b))将两个或多个维数相同数组合并成一个新的数组

  • 根据数值范围创建数组
函数说明
np.linspace(start,stop,想要的元素个数,endpoint)

根据起止数据等间距的填充数据,形成数组

endpoint:bool类,最后一个元素是否要包含在数组中

例:np.linspace(1,10,4)一>  数组:1,4,7,10

np.arange

([start,]  结束  [,step]

类似 array 和 range 函数的组合

例:np.arange(n)  一>  返回ndarray类型,元素从0到n-1

  • 利用random函数生成随机数组

         语法:import random

                    np.random.randn(shape)     生成shape型的随机数

         额外操作:保留小数位数

                    np.round(a,2)   #变量a,保留两位小数点

 3.3 高维数组的创建

  • 方式一:序列(列表)的嵌套,如下:
a = np.array([[1,2],[3,4]])
b = np.array([[[1,2],[5,6]],
              [[1,2],[3,4]],
              [[1,2], [3,4]]])
print(a.ndim,b.ndim)  # 2 3
print(a.shape,b.shape) # (2, 2) (3, 2, 2)

a中数据是一个包含列表的列表,即双层嵌套,故形成了一个2*2的二维数组

b中数据是一个三层列表的嵌套,故形成了一个 3*2*2 的三维数组(可理解成三个2*2的二维数组)

  • 判断高维列表维数的技巧:1)看array与第一个数字间有几个“ [ ”,就是几维

                                                   2)看shape中有几个数就是几维                                            

  •  方式二:利用函数创建,为shape传递一个元组
c = np.zeros((3,2,1))
print(c)
print(c.ndim,c.shape) # 3 (3, 2, 1)

4.数组的变换

 4.1 维度的变换

方法说明
arr.reshape(shape)

不改变数组元素,新建一个shape形状的数组,原数组不变

    要求:shape中乘积为元素总个数

arr.resize(shape)同上,但修改原数组
arr.swapaxes(a,b)将数组n个维度中两个维度进行调换
arr.flatten()对数组进行降维,返回折叠后的一维数组,原数组不变

 4.2 元素类型的变换

           语法:arr.astype(元素数据类型)

           说明:将数组中元素的类型进行转变,这个操作会新建一个数组,原数组不变

 4.3 数组转化为列表 

             语法:arr.tolist()

             作用:数组中的计算速度更快,占用空间更小;但列表可以存储多种数据类型

import numpy as np
# 维度的变换
a = np.array([[1,2],[1,3],[1,2],[2,3]])
print(a)
print(a.ndim) # dim a = 2
print(a.shape)  # shape a = (4,2)

b = a.reshape((2,4))  # shape b = (2,4)
print(b)
print(b.ndim)   # dim b = 2
print("-" * 30)

# 元素类型的变换
c = np.ones((2,3,4),dtype = np.int32)
print(c)

d = c.astype(np.float32)
print(d)
print("-" * 30)

# 转化为列表
e = a.tolist()
print(e)
print(type(e))

5.数组计算

运算说明备注

a + 1

数组a的所有元素都加1

相当于加一个与a形状一样且全为1的数组

减乘除 同理

a + b

a、b的shape一样

对应元素分别相加

a + b

a是一维数组

b是多维数组

a的这一行,与b的每一行分别相运算

一维数组和多维数组可以运算

要求:在某一维度上shape一样

第三种运算具体图解

上述第三种运算,不同尺寸数组之间什么时候可以运算?—— 广播原则

  • 广播原则

  如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失的 或长度为1的维度上进行。

 例如:(3,2,3)和(2,3):可以运算,后缘维度都是(3,2)

            (3,2,2)和(2,1):可以运算,后者后缘维度长度是1

            (3,2,4)和(1,4):可以运算,最后一个后缘维度相等,倒数第二个后者为1

            (3,2,4)和(1,2):不能运算,后缘维度不相等,且均不为1

6.数组的索引和切片

 6.1 基础索引

  • 一维数组的索引和切片(与python列表类似

       编号方式:从0开始向右递增;或者从-1开始向左递减

       索引数组名 [ 编号数 ]

       切片数组名 [ 起始编号:终止编号(不含):步长 ]

  • 多维数组的索引和切片(以三维数组为例)

        索引数组名 [ a , b , c ]    每个维度一个索引值,用逗号分割

        切片:同上,在每个维度上分别切片(方法同一维),中间用逗号隔开

                   切片本质上是分别在在轴上进行切片

特殊形式:[ : , 1:3 , ::2 ]   
 “ :” 表示在这个维度上全部都取
 “1:3” 表示在这个维度上取编号1~编号3的元素
  “ ::2 ” 表示在这个维度上从头取到尾,步长为2

  

  • 注:由于Numpy经常处理大数组,避免每次都复制,所以切片在修改时直接修改了原数组 
import numpy as np
a = np.array(range(12)).reshape(3,2,2)
print(a)
b = a[2:,1:,:] 
print(b)
a[2:,1:,:] = 50 # 修改a中切片的值
print(a) # a数组也跟着发生变化

        我们也可以利用这一点来修改数组的数据,例如:

import numpy as np
arr = np.zeros((4,3),dtype=int)
arr[:] = 5 #相当于切片了所有数据
print(arr)

                                           

 6.2 布尔索引 

与数学操作类似,数组的比较操作也是可以向量化的,因此比较数组会返回给我们一个bool值数组

直接输入print(条件)即可,也可利用 数组名[ 条件 ] = n 来进行赋值

  • 例1:把一维数组进行01化处理(大于5的设为1,小于5的设为0)
import numpy as np
a = np.arange(13)
print(a)
a[a <= 5] = 0
a[a > 5] = 1
print(a) #结果为:[0 0 0 0 0 0 1 1 1 1 1 1 1]

                                           

  • 例2:找出大于6且为偶数的数,并赋值为0

        python的关键字and 和 or 对布尔数值并没有用,需要使用 & 和 | 来代替

        另外,~ 符号可以用来对一个条件取反时使用

import numpy as np
a = np.arange(12).reshape(2,6)
print(a)
print("-"*40)
tiaojian = (a%2==0) & (a>5) #条件
print(tiaojian)
a[tiaojian] = 0
print("-"*40)
print(a)

 6.3 神奇索引

神奇索引主要用于描述使用整数数组进行数据索引

import numpy as np
a = np.arange(32).reshape(8,4)
print(a)
print("-"* 30)
print(a[[4,3,0,6]])   # 返回第4行,第3行,第0行,第6行
print("-"* 30)
print(a[[1,5,7,2],[0,3,1,2]])   # 取第1行第0列,第5行第3列,第7行第1列,第2行第2列

  • 案例:获取数组中最大的前N个数字
import numpy as np
a = np.random.randint(1,100,10)
print(a)
xiabiao = a.argsort()[-3:] #argsort()会返回排序后的下标,选取最大的三个
print(xiabiao)
max = a[xiabiao]
print(max)

                                        

7.数组的轴(axis)

 7.1 轴的介绍

     在官网中有这样一句话:“ In NumPy dimensions are called axes”,即维度称为轴 

    一般如果维度是二维,我们就可以用x、y轴去描述一个点;如果是三维,就需要再加上z轴

    所以我们可以将二者等价理解            

轴的简单图解

  • 凡是提到轴,先看数组的维度,有几维就有几个轴       

      轴的编号 和 切片时我们使用的shape元组的索引是对等的,一条轴其实就是一个维度(层级)

      而且轴的方向与索引编号方向一致

      例如:shape(3,2,4):分别对应(0轴,1轴,2轴);

                   而对具体维度而言,0轴对应三维,1轴对应二维,2轴对应一维

  • 我们经常用到的shape可以理解为在每个轴(axis)上的size

       如下图:axis=0表示第一层(黑色),该层数组的size为3;axis=1表示第二层(红色),该层数组的size为2;axis=2表示第三层(蓝色),对应轴上的元素length = 4。

 7.2 numpy转置换轴

  例:要将data(2,3)转化为(3,2)

 

方法语法说明
reshape(重组)data.reshape(3,2)
transpose(矩阵转置)

data.transpose ( )

也可简写为  data.T

行列转置
swapaxes(轴转置)data.swapaxes(1,0)

该方法参数接收一对轴编号,

并对轴进行调整用于重组数据

     

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RHCE8 资料整理(十一)

RHCE8 资料整理 第 32 章 控制语句32.1 判断语句 when32.1.1 when 判断中>、<、!和的使用32.1.2 when 判断中 in的用法32.1.3 when 判断中 is的用法 32.2 判断语句 block-rescue32.3 循环语句 第 32 章 控制语句 一个play中可以包含多个task&#xff0c;如果不想所有的t…

电子学会C/C++编程等级考试2022年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队2 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

董宇辉“回归”成为东方甄选高级合伙人,尘埃落地后是谁赢了?

董宇辉“回归”成为东方甄选高级合伙人&#xff0c;尘埃落地后是谁赢了&#xff1f; 董宇辉的“小作文事件”“CEO摔手机事件”迎来大结局了&#xff01; 就在12月18日&#xff0c;董宇辉被任命为新东方教育科技集团董事长文化助理&#xff0c;兼任新东方文旅集团副总裁。有朋…

Excel如何将行的值转换为列值?

问题:Excel如何将行的值转换为列值?(如图左表变成右表) 1.用 SUMIFS(求和区域, 条件区域1, 条件1, [条件区域2, 条件2], ...)函数 比如:=SUMIFS($C$2:$C$8,$A$2:$A$8,H3,$B$2:$B$8,"快车") 2.直接用简单的透视表 (1)随机点击目标目标表格任何位置,点击插入…

Gin之GORM事务(转账操作)

禁用默认事务的操作 为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。 // 全局禁用 db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{SkipDef…

Just Laws -- 中华人民共和国法律文库,简单便捷的打开方式

链接&#xff1a;JustLaws | Home 一个简洁便捷的中华人民共和国法律文库&#xff0c;而且收录比较完善&#xff0c;都是平常网民可能用到比较多的法律知识&#xff0c;目前包括宪法及宪法相关法、民商法、行政法、经济法、社会法、刑法和程序法等等 页面以文档的风格展示每一…

Java设计模式:工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

正向代理和反向代理的区别与联系

一、代理 代理就相当于中间商,本来A和B是可以直接连接的,但是此时添加了一个C在中间,A跟B不直接连接,而是通过C作为中介进行连接。最常见的例子就是二手东,其实很多我们租房子时签约的人不是房子的真正房东,而是房东委托的中介,房东不想管事或者房子太多,只靠自己无法进行管理,…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

七:爬虫-数据解析之正则表达式

七&#xff1a;正则表达式概述 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xf…

Java解决不同路径问题2

Java解决不同路径问题2 01题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中…

移动云捐赠三款开源项目,加速新一代基础软件生态繁荣

随着云计算、大数据、人工智能等新领域新信息技术的发展&#xff0c;我国基础软件的自主可控极大程度地影响着产业链上下游的多样性和技术创新的发展空间。移动云作为中国移动涉云业务的主入口&#xff0c;一直坚持共享开源价值&#xff0c;积极推动中国开源软件生态的繁荣发展…

AWS 知识一:如何在AWS上启动云AD服务器(详细到极致)

前言&#xff1a; 首先这里指的云AD服务器&#xff0c;只是为了让读友更好理解。云AD服务器在AWS中称为目录。AWS一共提供了4种目录类别&#xff0c;下面我将全程使用AWS托管微软AD这种目录类别进行示例。他完全提供了和Microsoft AD的功能&#xff0c;包括NTLM&#xff0c;Ker…

机器学习基础实验(使用 Pandas 进行数据探索)

介绍 本次实验通过分析电信运营商的客户离网率数据集来熟悉 Pandas 数据探索的常用方法&#xff0c;并构建一个预测客户离网率的简单模型。 知识点 排列索引交叉表透视表数据探索 课程介绍 机器学习开放基础课程是蓝桥云课经由 Open Machine Learning Course 授权并制作的…

Oracle定时任务的创建与禁用/删除

在开始操作之前&#xff0c;先从三W开始&#xff0c;即我常说的what 是什么&#xff1b;why 为什么使用&#xff1b;how 如何使用。 一、Oracle定时器是什么 Oracle定时器是一种用于在特定时间执行任务或存储过程的工具&#xff0c;可以根据需求设置不同的时间段和频率来执行…

el-form与el-upload结合上传带附件的表单数据(后端篇)

1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈&#xff0c;参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据&#xff08;前端篇&#xff09;-CSDN博客。 2.需求描述 在OA办公系统中&#xff0c;流程表单申请人…

无约束优化问题求解笔记(1)

目录 1. 迭代求解的基本流程与停止准则1.1 迭代求解的基本流程1.2 停止准则1.3 收敛阶 2. 线搜索方法2.1 精确线搜索2.2 非精确搜索**Goldstein 准则****Wolfe 准则** 2.3 线搜索算法的收敛性 1. 迭代求解的基本流程与停止准则 1.1 迭代求解的基本流程 优化问题的解通常无法直…

[总线仲裁]

目录 一. 集中仲裁方式1.1 链式查询方式1.2 计数器查询方式1.3 独立请求方式 二. 分布式仲裁方式 总线仲裁是为了解决多个设备争用总线这个问题 \quad 一. 集中仲裁方式 \quad 集中仲裁方式: 就像是霸道总裁来决定谁先获得总线控制权 分布仲裁方式: 商量着谁先获得总线控制权 …

【六大排序详解】开篇 :插入排序 与 希尔排序

插入排序 与 希尔排序 六大排序之二 插入排序 与 希尔排序1 排序1.1排序的概念 2 插入排序2.1 插入排序原理2.2 排序步骤2.3 代码实现 3 希尔排序3.1 希尔排序原理3.2 排序步骤3.3 代码实现 4 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&am…

基于ssm高校推免报名系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把高校推免报名管理与现在网络相结合&#xff0c;利用java技术建设高校推免报名管理系统&#xff0c;实现高校推免报名的信息化。则对于进一步提高高校推免报名管理发展&#xff0c;丰富高校推免报名管理经验能起到不少的促进作用。…