热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python向量计算库教程_NumPy库入门教程:基础知识总结

原标题:NumPy库入门教程:基础知识总结视学算法|作者知乎专栏|来源numpy可以说是Python运用于人工智能和科学计算的一个重要基础,

原标题:NumPy库入门教程:基础知识总结

661da850fae3ecf52507723bc8fb2c1a.png

视学算法 | 作者

知乎专栏 | 来源

numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas,sklearn等一些Python机器学习和科学计算库,因此在此总结一下常用的用法。

1

numpy数组(array)的创建

通过array方式创建,向array中传入一个 list实现

一维数组的创建:

cf641ff89eb6ef594e7e378a295d93a2.png

二维数组的创建:传入一个嵌套的list即可,如下例:

93ad1a79dcbcb58202d7ac8d086f98bf.png

通过arange创建数组:下例中创建一个0~1间隔为0.1的行向量,从0开始,不包括1,第二个例子通过对齐广播方式生成一个多维的数组。

73a1e80314fe8a0f9579357ec3f308ad.png

01394bc59aa949d4ee8b6066c79c041b.png

通过linspace函数创建数组:下例中创建一个0~1间隔为1/9的行向量(按等差数列形式生成),从0开始,包括1.

593a776de76db07a699ceffe31fb0096.png

通过logspace函数创建数组:下例中创建一个1~100, 有20个元素的行向量(按等比数列形式生成),其中0表示10^0=1,2表示10^2=100,从1开始,包括100

447ab22cade6b37fad9b957066f25e7e.png

生成特殊形式数组:

生成全0数组(zeros函数),生成全1数组(ones函数), 仅分配内存但不初始化的数组(empty函数)。

注意要 指定数组的规模(用一个元组指定),同时要指定元素的类型,否则会报错

20604bfffed0005a4b97b0854a28fb47.png

生成随机数组

a766901103473f3e96e6fdeccd600a6d.png

通过frombuffer,fromstring,fromfile和fromfunction等函数从 字节序列、文件等创建数组,下例中生成一个9*9乘法表

f8c23a3a24855811f5c302485bab6a5d.png

2

显示、创建、改变的数组元素

的属性、数组的尺寸(shape)等

fdcfebdb5c8a932180ac5302332811e5.png

f7d2b6531d092f7fc6608dd0b1d7d7c5.png

3

改变数组的尺寸(shape)

reshape方法,第一个例子是将43矩阵转为34矩阵,第二个例子是将行向量转为列向量。注意在numpy中, 当某个轴的指定为-1时,此时numpy会根据实际的数组元素个数自动替换-1为具体的大小,如第二例,我们指明了c仅有一列,而b数组有12个元素,因此c被自动指定为12行1列的矩阵,即一个12维的列向量。

d38c66f6aadf04bba3930f62fd3d1253.png

912562aa16274161d8326d4b931e0a96.png

4

元素索引和修改

简单的索引形式和切片:

003d180a78d62cf63abc4780fbeba738.png

a2b390d46921838eb2207cb4e285d2c4.png

当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于 布尔数组(array), 不能使用布尔列表(list)。(附注:当布尔数组的长度与被索引的数组的长度短时,不足的部分都当作False)

acc157eba8a1ac3da16f8f060000b8ce.png

利用条件进行索引:利用不等式等进行索引

ff35e4ef14006ca7deaa7b83ed2fc380.png

多维数组的索引和切片(右边框图中的颜色和左边的指令的颜色相对应):

c850f39ba6894724caef0727584e3386.png

同样的,可以采用 bool型的方式对数组进行索引和切片操作

0620ad2f3b5a764f10432f4f033694a9.png

其实多维数组的索引还是很好理解的,例如下例中,我们可以看到对于一个张量,也就是b,对其索引是,[i,j,k]中的i表示选择第几个二维数组, 然后j表示取二维数组中的第几个行向量,k表示取行向量中的第几个元素。

a3db65efaab79eb1066ce190052b62a8.png

5

ufunc操作

ufunc是universal function的缩写, 它是一种能对数组的每个元素进行操作的函数。numPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。下面给一个计算sin函数(sin函数计算数组中全部元素的sin值)的小实例:

909c2334dd4141ba301048f2608a3e99.png

四则运算符可以直接用于数组(一维或多维)计算:

b455b2d1927dd111c99eb6b71816fd30.png

8e16b0baa70dca8864faa09a2a896471.png

比较操作也可直接进行,如下,比较x1和x2各对应元素的大小,返回的是一个bool型数组。

可用的操作符有 ‘==’,‘!

&#61;’&#xff0c;‘’&#xff0c;‘<&#61;’&#xff0c;‘>&#61;’等。另外可以使用数组的any或all方法。 只要数组中有一个值为True&#xff0c;则any返回True&#xff1b;而只有数组的全部元素都为True&#xff0c;all才返回True。

1ee060f242b90b5612d15f52e0146b95.png

849407b310092e9d9398d996a6812419.png

想要了解更多的numpy自带的ufunc函数&#xff0c;可以查看这篇博客&#xff1a;

自定义ufunc函数&#xff1a;frompyfunc(func,nin,nout) 函数可以将计算单个值的函数转换成一个可对数组中每个元素进行计算的ufunc函数。 其中nin是输入func的参数的个数&#xff0c;nout是func返回值的个数。如下例。

c746208b67a68ec151398df6a1e9cb0e.png

reduce方法(与 Python的reduce函数类似&#xff0c;其沿着axis轴对array进行操作)

928c56fbb4515906826b41f95247b461.png

2e4121266dbb2b8d3ddd8c7c2f6f8a98.png

accumulate方法(其作用和reduce方法类似&#xff0c;但是会保存中间结果)

b65adb3e0ba39987288d51fd04ee0b1d.png

outer方法(对其两个参数数组的每两对元素的组合进行运算&#xff0c;计算外积)&#xff1a;若数组a的维数为M&#xff0c;数组b的维数为N&#xff0c; 则ufunc函数op的outer方法对a、b数组计算所生成的数组c的维数为M&#43;N&#xff0c;c的形状是a、b的形状的结合。例如a的形状为(2,3)&#xff0c;b的形状为(4,5)&#xff0c;则c的形状为(2,3,4,5)。

8ed32e7aaefade9131093823d9e03e20.png

6

广播操作

广播是针对形状不同的数组的运算采取的操作。当我们使用ufunc函数对两个数组进行计算时&#xff0c;ufunc函数会对这两个数组的对应元素进行计算&#xff0c;因此它要求这两个数组有 相同的大小(shape相同)。如果两个数组的shape不同的话(行列规模不等)&#xff0c;会进行如下的广播(broadcasting)处理&#xff1a;

1)让所有输入数组都向 其中shape最长的数组看齐&#xff0c;shape中不足的部分都通过在前面加1补齐。因此输出数组的shape是输入数组shape的各个轴上的最大值(往最大轴长上靠)。

2)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时&#xff0c;这个数组能够用来计算&#xff0c;否则出错。

3)当输入数组的某个轴的 长度为1时&#xff0c;沿着此轴运算时都用此轴上的第一组值。

011da97fce2a777ea5eb72e75a97a6b1.png

感觉说的不太明白&#xff0c;于是还是用实例说话好了。

7

矩阵运算

矩阵乘法(dot乘法&#xff0c; 注意要符合矩阵乘法规则)

d28c8d8c4b90dfb96fc11f006d3439a9.png

内积(inner&#xff0c;计算向量/矩阵内积)&#xff1a;和dot乘积一样&#xff0c;对于两个一维数组&#xff0c;计算的是这两个数组对应下标元素的乘积和&#xff1b; 对于多维数组a和b&#xff0c;它计算的结果数组中的每个元素都是数组a和b的最后一维的内积&#xff0c;因此数组a和b的最后一维的长度必须相同。

计算公式为&#xff1a;

inner(a, b)[i,j,k,m] &#61; sum(a[i,j,:]*b[k,m,:])

5b358ac4bcda941ba64c98c6345f3003.png

a51575c4123828ed0bacf12c8ce297f0.png

外积(outer&#xff0c;计算外积)&#xff1a;只按照一维数组进行计算&#xff0c;如果传入参数是多维数组&#xff0c;则先将此数组展平为一维数组之后再进行运算。outer乘积计算的列向量和行向量的矩阵乘积。

4e17c41d4a9f34ada4195a5c9f0aeb5d.png

解线性方程组(solve)&#xff1a;solve(a,b)有两个参数a和b。 a是一个N*N的二维数组&#xff0c;而b是一个长度为N的一维数组&#xff0c;solve函数找到一个长度为N的一维数组x&#xff0c;使得a和x的矩阵乘积正好等于b&#xff0c;数组x就是多元一次方程组的解。

0a67ec9be211903e022e8b81566809dd.png

8

文件存取

(假设有数组array为a&#xff0c;假定类型为int32)

a.tofile(file_name) &#xff0c;保存a到file_name文件中&#xff0c;file_name为字符串类型&#xff0c;如‘a.txt’等&#xff1b;从文件中读回a数组时需要指明类型&#xff0c;如&#xff1a;b&#61;np.fromfile(file_name,dtype&#61;np.float)

时会报错&#xff0c;正确的使用方式是&#xff1a;

b&#61;np.fromfile(file_name,dtype&#61;np.int32)

save和load方法(写入文件和从文件读回都不需要指明类型&#xff0c;存储文件类型为npy格式文件)&#xff1a;

np.save(“a.npy”, a) # 将array a存入a.npy文件中c &#61; np.load( “a.npy” ) # 从a.npy文件中读回array a

savetxt和loadtxt方法(保存为txt格式文件)&#xff1a;

np.savetxt(“a.txt”, a) # 将array a存入a.txt文件中np.loadtxt(“a.txt”) # 从a.txt文件中读回array a返回搜狐&#xff0c;查看更多

责任编辑&#xff1a;



推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 单元测试:使用mocha和should.js搭建nodejs的单元测试
    2019独角兽企业重金招聘Python工程师标准BDD测试利器:mochashould.js众所周知对于任何一个项目来说,做好单元测试都是必不可少 ... [详细]
  • 在PHP中,为了更高效地打开和读取目录并列出其中的文件,可以使用一个自定义函数来返回查询目录下的文件和文件夹列表。该函数会将结果以数组形式返回,并明确区分每个条目是文件还是目录,从而提供更友好和实用的输出。此外,该函数还可以进一步扩展,支持递归查询子目录,以便更全面地获取目录结构信息。 ... [详细]
  • 在 LeetCode 第 307 题中,我们详细探讨了树状数组(Fenwick Tree)的应用及其优化策略。树状数组 `tree` 用于存储特定区间内的元素和,其中区间的左边界是当前索引的二进制表示中去掉最后一个 1 后再加 1,右边界即为当前索引本身。此外,还维护了一个原始数组 `nums` 和一个表示数组长度的变量 `N`。通过这些结构,我们可以高效地实现区间求和与单点更新操作。 ... [详细]
  • 遗传算法中选择算子为何置于交叉算子和变异算子之前?本文探讨了这一问题,并详细介绍了遗传算法中常用的选择算子类型及其作用机制。此外,还分析了不同选择算子对算法性能的影响,为实际应用提供了理论依据。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
author-avatar
青烟_I乀n-a_396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有