numpy快速入门笔记

developerdaily developerdaily     2022-10-12     340

关键词:

我正以Python作为突破口,入门机器学习相关知识。出于机器学习实践过程中的需要,我快速了解了一下NumPy这个科学计算库的使用方法。下面记录相关学习笔记。

简介

NumPy是一个科学计算库。结合Python生态系统的其它库,如SciPymatplotlib等,NumPy可以玩出比MatLAB还出彩的花样。

NumPy的主要核心在于其定义了一个强大的N维数组类型ndarray。本文内容全部围绕着这个类型展开,主要参考NumPy官网的QuickStart教程和BroadCast文档进行讲述,
对于我认为很基础的内容可能会进行省略,若有不理解的地方请参考源文档。

围绕N维数组,NumPy定义了许多函数,例如numpy.sinnumpy.cosnumpy.exp等。接下来的内容中将用np表示numpy模块,即假设我们已经执行了下面代码:

import numpy as np

认识ndarray

ndarray是一个N维数组,我觉得它跟线性代数中介绍的空间的概念很贴近。

创建ndarray实例

手动创建ndarray实例可以使用np.array函数。

array = np.array([1,2,3]) # 创建一个含有三个元素一维数组

注意这个函数的参数是一个list列表对象,而不是多个数字。即np.array(1,2,3)是错误的。如果传递的参数list是一个嵌套的list,np.array函数可以自动根据其嵌套方式生成多维数组。另外还可以通过关键词参数dtype,定义数组元素的类型。默认地,新数组的元素类型为np.float64

除了np.array函数,我们还可以用np.zerosnp.onesnp.emptynp.arangenp.linspacenp.fromfunction等函数创建数组对象。

下面看几个例子:

np.zeros((3,4)) # 创建元素为0的3行4列的数组
np.ones((2,3,4), dtype=np.int16) # 创建元素为1的2x3x4数组,类型为np.int16
np.empty((3,4)) # 创建元素为随机数的3x4数组
np.arange(1, 10, 1) # 在1到10中以1为间距提取实数组成一维数组
np.arange(10) # 省略方式,功能同上
np.linspace(0, 10, 5) # 在0到10中等间距提取5个实数组成一维数组
...

基本操作

ndarray基本操作指的是加减乘除等运算。除了下面几点需要注意,没太多内容。

  • 参与运算的数组元素类型不一致的,输出结果的元素类型将为精度更高的类型。
  • 维度相同的数组的操作一般(矩阵点乘叉乘等除外)遵循对应元素分别相操作,生成的新元素组成结果。
  • 维度不相同的数组如果符合NumPy的广播规则,将按广播定义的规则进行操作;否则抛出异常。(文章最后会有关于广播规则的介绍)
  • 设有数组A、B,那么A*B是元素乘积,即每个元素对应相乘;而A.dot(B)或np.dot(A,B)表示矩阵点乘。

访问数组的元素与切片

一维数组的访问方式跟Python的list列表对象的访问方式一样。
通过逗号分隔索引组成的列表的方式访问。每个索引值从高到低对应数组的维度。

访问多维数组的元素

访问元素的索引是一个整数,表示某个维度中的下标。

设有多维数组A为[[[1,2],[3,4]],[[5,6],[7,8]]],下面结合例子辅助理解:

  • A[0]: 访问数组A第一维度的第一个元素,为[[1,2],[3,4]]。
  • A[1,1]: 先取数组A第一维度的第二个元素B(是一个第二维度的元素),然后取B其中的第二个元素,为数组[7,8]。
  • A[1,1,1]: 原理如上,结果为标量8。

访问多维数组的切片

访问切片用冒号分割整数的方式表示索引,形如x:y:z的样子,x表示开始下标(包含),y表示结束下标(不包含),z为步长(省略为1)。
还可以用...符号作为尽可能多全选切片索引的省略标记。

  • A[0:1]: 返回“第一维元素中所有下标大于等于0且小于1的元素”组成的新数组。它依旧是一个三维数组,为[[[1, 2],[3, 4]]]
  • A[0:1:2]: 在这个例子中结果同上,最后一个2是选择的步长,因为我们最多只有两个元素,所以在选择了下标为0的元素后步长加2就没有其他元素了。
  • A[0:1,0:1]: 返回“第一维元素中所有下标大于等于0且小于1,并且第二维元素所有下标大于等于0且小于1的元素”组成的新数组。它依旧是一个三维数组,为[[[1, 2]]]
  • A[...,0:1]: 省略号表示尽可能多的全选切片,等同于A[:,:,0:1],所以结果为[[[1],[3]],[[5],[7]]]

同时访问元素和切片

这种情况真它大爷的是一个让人很难解释的过程。只能总结一下我认识的规律。针对这种情况,我的做法是补全所有遗漏索引,数一下出现元素索引的数目即可判断结果将会降多少个维度。然后按照上面访问切片的理解选取每个维度中选中切片。

  • A[0:1,0]: 等同补全索引后的A[0:1,0,:],结果是降了一个维度的[[1, 2]]。选取的条件要同时满足:
    “第一维度下标大于等于0且小于1,并且第三维度全选”的切片,而“第二维度取下标为0”的元素。

数组的变形、拼接、分割、浅拷贝和深拷贝

这部分内容也是想略过的。下面简单提及相关的函数,使用时通过Pythonhelp函数可以获取更详细的介绍。同样地,假设我们已经有了数组A。

  • 变形:A.ravel()返回A扁平化后的一维数组;A.T返回A的转置;A.reshape(indics)返回A变形后的新数组;A.resize(indics)修改A的维度,不返回新数组。
  • 拼接:np.hstack(A,...)np.vstack(A,...)等。
  • 分割:np.hsplit(A, indics)np.vsplit(A, indics)等。
  • 浅拷贝:B = A.view()
  • 深拷贝:B = np.copy(A)或者B = A.copy()

NumPy的广播规则

当对两个数组进行某种操作的时候,如果这两个数组的维度是一样的,通常按照操作的定义完成操作即可。但是总会出现两个数组维度不一样的场景,这是怎么办?

NumPy认为部分维度不一样的数组间的操作是有意义的。针对这种有意义的情况,引入了广播的概念,从而实现操作。下面总结一下我对广播的理解。

  1. 对输入的两个数组a和b,先用1给维度数目小的数组在前面补全它的shape。例如现在有a.shape(1,3,4)b.shape(4),则b补全后为(1, 1, 4)

  2. 从最低维度向最高维度,逐一比对在这个维度中的长度。例如:a.shape(3,4)b.shape(2,1)。先比对4和1,然后比对3和2,以此类推。

  3. 比对结果若是相等,或者其中有一个数为1,则可以使用广播。否则报ValueError异常。而操作的输出结果的各个维度值是其中大的值。例如:a.shape(3,4)b.shape(3,1),对比结果可以使用广播,现在让二者相加,则(a+b).shape(3,4)

  4. 符合广播规则,将执行最终操作。根据维度比对的结果,把维度小的向维度大的扩展。扩展的方法:维度值一样保持不变;维度不一样时,维度小的数组的值肯定是1,这时候则是以当前维度的这个唯一元素作为整体,其他空缺的元素的值都用这个值参与计算。

最后,看一个例子:

a = np.array([[[1],[1],[1]],[[1],[1],[1]]])
b = np.array([[1,2],[1,2],[1,2]])

有两个数组a和b,他们的维度分别为(2,3,1)(3,2)。很明显,两个数组的维度不一样了。我们需要扩展b的维度,扩展后是(1,3,2)。然后从右边低维向左边高维对(2,3,1)(1,3,2)进行比对,发现符合广播的规则。

我们发现数组a的最低维是1,需要扩展为2。这个维度的元素只有一个标量1,它应该要有两个元素,所以扩展后就是:[[[1,1],[1,1],[1,1]],[[1,1],[1,1],[1,1]]]

同样地,数组b的最高维度是1,需要扩展为2。这个维度的元素是一个数组[[1,2],[1,2],[1,2]],因此我们复用这个元素,扩展结果为:[[[1,2],[1,2],[1,2]],[[1,2],[1,2],[1,2]]]

最后用这两个扩展后的结果进行操作。

注意:上面总结提到的扩展在NumPy实际计算的时候是虚拟实现的,并不会生成额外的对象或占用额外的内存,因此它的效率是有保证的。

 

本文来自同步博客

机器学习matplotlib快速入门笔记

Matplotlib快速入门笔记XuAn  2018-4-7import matplotlib.pyplot as pltimport numpy as npfrom mpl_toolkits.mplot3d import Axes3D1、基本图形绘制x=np.linspace(-1,1, 查看详情

numpy快速入门(代码片段)

系列文章目录Python数据分析基础教程(NumPy学习指南)文章目录系列文章目录一.Python二.windows平台安装Python三.windows平台安装NumPy、Matplotlib、Scipy四.数组对象五.向量加法一.PythonNumPy是基于Python的,因此在安装NumPy之前&#... 查看详情

numpy快速入门(代码片段)

系列文章目录Python数据科学家养成计划(NumPy学习指南)文章目录系列文章目录一.Python二.windows平台安装Python三.windows平台安装NumPy、Matplotlib、Scipy四.数组对象五.向量加法一.PythonNumPy是基于Python的,因此在安装NumPy之... 查看详情

tensorflow.org教程笔记datasets快速入门(代码片段)

本文翻译自www.tensorflow.org的英文教程。tf.data模块包含一组类,可以让你轻松加载数据,操作数据并将其输入到模型中。本文通过两个简单的例子来介绍这个API从内存中的numpy数组读取数据。从csv文件中读取行基本输入对于刚开始... 查看详情

numpy快速入门(代码片段)

一Numpy概述1.定义​开源的python科学计算库​用于快速处理任意维度的数组​Numpy中存储对象ndarray2.创建np.array3.优势内存块风格,一体化存储支持并行化运算效率高与纯python–底层使用了c二N维数组ndarray1.ndarray的属性属性名字... 查看详情

datawhalepowerful-numpy《从小白到入门》学习笔记(代码片段)

Datawhalepowerful-numpy《从小白到入门》学习笔记持续更新中文章目录Datawhalepowerful-numpy《从小白到入门》学习笔记摘自官方文档的一些话WhatisNumPy?WhyisNumPyFast?WhoElseUsesNumPy?一.创建和生成1.从python列表或元组创建从列表创建从元组创建... 查看详情

[学习笔记][数据分析]02numpy入门与应用

01、NumPy基本功能        ※数据类型的转换在实际操作过程中很重要!!!※     ※ndarray的基本索引与切片※  布尔型数组的长度必须跟被索引的轴长度一致  花式索引是利用“整数数组”进行索引。整... 查看详情

python数据科学快速入门系列|01numpy初窥——基础概念(代码片段)

这是机器未来的第36篇文章原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125969065文章目录1.主题2.Numpy是什么?3.Numpy的基础概念3.1标量、向量、矩阵、张量3.1.1标量3.1.2向量3.1.3矩阵3.1.4张量4.Numpy的核心:ndarray... 查看详情

numpy基础入门

...下:①ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。②用于对整组数据进行快速运算的标准数学函数 查看详情

numpy基础笔记

...p; ①ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。  ②用于对整组数据进行快速运算的标准数学函数(无需编写循环)。   查看详情

给深度学习入门者的python快速教程-numpy和matplotlib篇

本篇部分代码的下载地址:https://github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/chap5上篇:给深度学习入门者的Python快速教程-基础篇5.3Python的科学计算包-Numpynumpy(Numerical Pythonextensions)是一个第三方的Python包ÿ 查看详情

深度学习基础之numpy,小白轻松入门numpy,送书了!!!(代码片段)

目录1、numpy的安装2、快速入门3.Numpy数组操作4、常用函数5、ndarray和list的区别6、总结送书活动第一期1、numpy的安装pipinstallnumpy2、快速入门2.1数据类型用过C语言的基本上都知道是哪几个类型,毕竟python是c实现的总结一下࿱... 查看详情

深度学习基础之numpy,小白轻松入门numpy,送书了!!!(代码片段)

目录1、numpy的安装2、快速入门3.Numpy数组操作4、常用函数5、ndarray和list的区别6、总结送书活动第一期1、numpy的安装pipinstallnumpy2、快速入门2.1数据类型用过C语言的基本上都知道是哪几个类型,毕竟python是c实现的总结一下࿱... 查看详情

numpy图解入门

...搁置了好久了,​​NumPy​​​和​​Pandas​​一直都在入门过程中。总不能一直这样,赶紧抽时间往前推进,也记录一下笔记。整理学习内容是巩固和结构化存储知识的一个非常有用的办法。PS:文中大量借用了《AVisualIntrotoNum... 查看详情

qt快速入门学习笔记(基础篇)

本文基于Qter开源社区论坛版主yafeilinux编写的《Qt快速入门系列教程目录》,网址:http://bbs.qter.org/forum.php?mod=viewthread&tid=193。参考书为基于该系列教程《QtCreator快速入门》和《Qt及QtQuick开发实战精解》1、关联Qt库。如果是分别... 查看详情

谷歌jax快速入门笔记详解和案例(代码片段)

一.什么是JAX?JAX最初由谷歌大脑团队的MattJohnson、RoyFrostig、DougalMaclaurin和ChrisLeary等人发起,借助Autograd的更新版本,并且结合了XLA,可对Python程序与NumPy运算执行自动微分,支持循环、分支、递归、闭包函数求导&#x... 查看详情

谷歌jax快速入门笔记详解和案例(代码片段)

一.什么是JAX?JAX最初由谷歌大脑团队的MattJohnson、RoyFrostig、DougalMaclaurin和ChrisLeary等人发起,借助Autograd的更新版本,并且结合了XLA,可对Python程序与NumPy运算执行自动微分,支持循环、分支、递归、闭包函数求导&#x... 查看详情

谷歌jax快速入门笔记详解和案例(代码片段)

一.什么是JAX?JAX最初由谷歌大脑团队的MattJohnson、RoyFrostig、DougalMaclaurin和ChrisLeary等人发起,借助Autograd的更新版本,并且结合了XLA,可对Python程序与NumPy运算执行自动微分,支持循环、分支、递归、闭包函数求导&#x... 查看详情