NumPy快速入门-- Less 基础/线性代数

文章目录

    • 1. 广播(Broadcasting)规则
    • 2. 使用索引数组索引
    • 3. 使用布尔值作为数组索引
    • 4. ix_()函数
    • 5. 线性代数 简单数组操作
    • 6. 技巧和提示
      • 6.1 “自动”整形
      • 6.2 矢量堆叠

1. 广播(Broadcasting)规则

Broadcasting允许通用函数以有意义的方式处理具有不完全相同形状的输入。

  • 第一个规则,如果所有输入数组不具有相同数量的维度,则“1”将被重复地添加到较小数组的形状,直到所有数组具有相同数量的维度

  • 第二个规则,确保沿着特定维度具有大小为1的数组表现得好像它们具有沿着该维度具有最大形状的数组的大小。假定数组元素的值沿“Broadcasting”数组的该维度相同。

在应用广播规则之后,所有阵列的大小必须匹配。

(以上不是特别明白)

2. 使用索引数组索引

>>> a = np.arange(12)**2
>>> a
array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121],dtype=int32)
>>> i = np.array([1,1,3,8,5])
>>> a[i]
array([ 1,  1,  9, 64, 25], dtype=int32)
>>> 
>>> j = np.array([[3,4],[9,7]])
>>> a[j]					# a[j] 形状与 j 一致
array([[ 9, 16],[81, 49]], dtype=int32)
  • 当被索引的数组 a 是一个多维数组,单个索引数组指的是 a第一个维度。以下示例通过使用调色板将标签图像转换为彩色图像来作为举例。
>>> palette = np.array([[0,0,0],[255,0,0],[0,255,0],[0,0,255],[255,255,255]])
>>> image = np.array([[0,1,2,0],[0,3,4,0]])
>>> palette[image]
array([[[  0,   0,   0],[255,   0,   0],[  0, 255,   0],[  0,   0,   0]],[[  0,   0,   0],[  0,   0, 255],[255, 255, 255],[  0,   0,   0]]])
  • 也可以给出多个维度的索引。每个维度的索引数组必须具有相同的形状。
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>> i = np.array([[0,1],[1,2]])		#行
>>> j = np.array([[2,1],[3,3]])		#列
>>> a[i,j]			# i,j 必须有相同的shape
array([[ 2,  5],[ 7, 11]])
>>> 
>>> a[i,2]
array([[ 2,  6],[ 6, 10]])
>>> 
>>> a[:,j]		#行和列的组合(0行所有的j...)
array([[[ 2,  1],[ 3,  3]],[[ 6,  5],[ 7,  7]],[[10,  9],[11, 11]]])
  • 当然,我们可以把 ij 放在一个序列中(比如一个列表), 然后用列表进行索引。
>>> l = [i,j]
>>> a[l]
array([[ 2,  5],		# 等效于 a[i,j][ 7, 11]])
  • 不能将 ij 放入一个数组中,因为这个数组将被解释为索引第一个维度。
>>> s = np.array([i,j])
>>> s
array([[[0, 1],[1, 2]],[[2, 1],[3, 3]]])
>>> a[s]
Traceback (most recent call last):File "<pyshell#36>", line 1, in <module>a[s]
IndexError: index 3 is out of bounds for axis 0 with size 3
>>> a[tuple(s)]		# 与 a[i,j] 一样
array([[ 2,  5],[ 7, 11]])
  • 索引数组的另一个常见用途是搜索时间相关序列的最大值

在这里插入图片描述

>>> time_max = time[idx]
>>> data_max = data[idx, range(data.shape[1])]	# => data[idx[0],0], data[idx[1],1]...
>>> time_max
array([ 82.5 ,  20.  , 113.75,  51.25])
>>> data_max
array([0.98935825, 0.84147098, 0.99060736, 0.6569866 ])
>>> np.all(data_max == data.max(axis=0))
True
  • 还可以使用数组索引作为目标来赋值
>>> a = np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> a[[1,2,3]] = 0
>>> a
array([0, 0, 0, 0, 4])
  • 当索引列表包含重复时,赋值多次,只留最后一个值
>>> a = np.arange(5)
>>> a[[0,0,2]] = [1,2,3]		# a[0]=1,a[0]=2,a[2]=3
>>> a
array([2, 1, 3, 3, 4])
  • 使用Python的 += 构造要小心,可能得不到你想要的效果
>>> a
array([0, 1, 2, 3, 4])
>>> a[[0,0,2]] += 1		# a[0] 只加了1次
>>> a
array([1, 1, 3, 3, 4])

即使0在索引列表中出现2次,第0个元素只会增加一次。这是因为Python要求“a + = 1”等同于“a = a + 1”

3. 使用布尔值作为数组索引

使用布尔值作为索引时,我们明确地选择数组中的哪些元素我们想要的,哪些不是。

我们可以想到的布尔索引最自然的方式是使用与原始数组具有相同形状的布尔数组

>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>> b = a > 4
>>> b
array([[False, False, False, False],[False,  True,  True,  True],[ True,  True,  True,  True]])
>>> a[b]		# 取出true的元素
array([ 5,  6,  7,  8,  9, 10, 11])
  • 此属性在赋值时非常有用
>>> a[b] = 0		# a中大于4的元素赋值为0
>>> a
array([[0, 1, 2, 3],[4, 0, 0, 0],[0, 0, 0, 0]])

使用布尔索引生成 Mandelbrot 集的图像(不懂)

import numpy as np
import matplotlib.pyplot as plt
def mandelbrot(h,w,maxit=20):# Returns an image of the Mandelbrot fractal of size (h,w)y,x = np.ogrid[-1.4:1.4:h*1j, -2:0.8:w*1j]c = x+y*1jz = cdivtime = maxit + np.zeros(z.shape, dtype=int)for i in range(maxit):z = z**2 + cdiverge = z*np.conj(z) > 2**2div_now = diverge & (divtime==maxit)divtime[div_now] = iz[diverge] = 2return divtimeplt.imshow(mandelbrot(400,400))
plt.show()

在这里插入图片描述
第二种使用布尔索引的方法更类似于整数索引; 对于数组的每个维度,给出一个一维布尔数组,选择我们想要的切片

>>> a = np.arange(12).reshape(3,4)
>>> b1 = np.array([False,True,True])             # 第一轴长度3=a中的3
>>> b2 = np.array([True,False,True,False])       # 第二轴长度4=a中的4
>>>
>>> a[b1,:]                                   # 选择b1内true的行
array([[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>>
>>> a[b1]                                     # 同上
array([[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>>
>>> a[:,b2]                                   # 选择b2内true的列
array([[ 0,  2],[ 4,  6],[ 8, 10]])
>>>
>>> a[b1,b2]                                  # 奇怪的结果!!!
array([ 4, 10])

1D布尔数组的长度必须与你要切片的维度(或轴)的长度一致。b1 是rank为1的数组,其长度为3( a 中行的数量), b2 (长度4)适合于索引 a 的第二个rank(列)。

4. ix_()函数

可以使用 ix_ 函数来组合不同的向量以获得每个n-uplet的结果。例如,如果要计算从向量a、b和c中的取得的所有三元组的所有a + b * c

>>> a = np.array([2,3,4,5])
>>> b = np.array([8,5,4])
>>> c = np.array([5,4,6,8,3])>>> ax,bx,cx = np.ix_(a,b,c)		# 分别取对应的,组合>>> ax
array([[[2]],[[3]],[[4]],[[5]]])
>>> bx
array([[[8],[5],[4]]])
>>> cx
array([[[5, 4, 6, 8, 3]]])
>>> ax.shape, bx.shape, cx.shape
((4, 1, 1), (1, 3, 1), (1, 1, 5))>>> result = ax+bx*cx
>>> result
array([[[42, 34, 50, 66, 26],[27, 22, 32, 42, 17],[22, 18, 26, 34, 14]],[[43, 35, 51, 67, 27],[28, 23, 33, 43, 18],[23, 19, 27, 35, 15]],[[44, 36, 52, 68, 28],[29, 24, 34, 44, 19],[24, 20, 28, 36, 16]],[[45, 37, 53, 69, 29],[30, 25, 35, 45, 20],[25, 21, 29, 37, 17]]])
>>> result[3,2,4]
17
>>> a[3]+b[2]*c[4]
17

以下版本的reduce的优点是它使用Broadcasting规则,以避免创建参数数组输出的大小乘以向量的数量。

>>> def func(f, *vectors):vs = np.ix_(*vectors)r = f.identityfor v in vs:r = f(r,v)return r>>> func(np.add,a,b,c)
array([[[15, 14, 16, 18, 13],[12, 11, 13, 15, 10],[11, 10, 12, 14,  9]],[[16, 15, 17, 19, 14],[13, 12, 14, 16, 11],[12, 11, 13, 15, 10]],[[17, 16, 18, 20, 15],[14, 13, 15, 17, 12],[13, 12, 14, 16, 11]],[[18, 17, 19, 21, 16],[15, 14, 16, 18, 13],[14, 13, 15, 17, 12]]])

5. 线性代数 简单数组操作

>>> a = np.array([[1.0,2.0],[3.0,4.0]])
>>> print(a)
[[1. 2.][3. 4.]]
>>> a.transpose()		#转置
array([[1., 3.],[2., 4.]])
>>> np.linalg.inv(a)		#矩阵求逆
array([[-2. ,  1. ],[ 1.5, -0.5]])>>> u = np.eye(2)	#对角线是1
>>> u
array([[1., 0.],[0., 1.]])
>>> j = np.array([[0.0,-1.0],[1.0,0.0]])
>>> np.dot(j,j)		#矩阵点积
array([[-1.,  0.],[ 0., -1.]])
>>> np.trace(u)
2.0
>>> y =  np.array([[5.0],[7.0]])
>>> np.linalg.solve(a,y)	# 求解矩阵方程
array([[-3.],[ 4.]])
>>> np.linalg.eig(j)
(array([0.+1.j, 0.-1.j]), array([[0.70710678+0.j        , 0.70710678-0.j        ],[0.        -0.70710678j, 0.        +0.70710678j]]))

6. 技巧和提示

6.1 “自动”整形

可以省略一个维度的尺寸,由其自动计算出来

>>> a = np.arange(30)
>>> a.shape = 2,-1,3	# -1 表示自行推导,省略
>>> a.shape
(2, 5, 3)
>>> a
array([[[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11],[12, 13, 14]],[[15, 16, 17],[18, 19, 20],[21, 22, 23],[24, 25, 26],[27, 28, 29]]])

6.2 矢量堆叠

column_stack,dstack,hstack,vstack

>>> x = np.arange(0,10,2)	#array([0, 2, 4, 6, 8])
>>> y = np.arange(5)		#array([0, 1, 2, 3, 4])
>>> m = np.vstack([x,y])
>>> m
array([[0, 2, 4, 6, 8],[0, 1, 2, 3, 4]])
>>> xy = np.hstack([x,y])
>>> xy
array([0, 2, 4, 6, 8, 0, 1, 2, 3, 4])

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Intel PAUSE指令变化影响到MySQL的性能,该如何解决?

MySQL得益于其开源属性、成熟的商业运作、良好的社区运营以及功能的不断迭代与完善&#xff0c;已经成为互联网关系型数据库的标配。可以说&#xff0c;X86服务器、Linux作为基础设施&#xff0c;跟MySQL一起构建了互联网数据存储服务的基石&#xff0c;三者相辅相成。本文将分…

会议 | CCKS 2019 全国知识图谱与语义计算大会在杭州隆重召开

本文转载自公众号&#xff1a;中国中文信息学会。2019 年全国知识图谱与语义计算大会(CCKS 2019)于 8 月 24 日至 27 日在杭州召开&#xff0c;由中国中文信息学会语言与知识计算专业委员会主办&#xff0c;浙江大学承办。本次会议主题是“知识智能”。大会吸引了来自海内外的八…

Hystrix 简介和使用

Hystrix一、概念二、使用1. 环境搭建2. 服务降级3. 异常熔断4. 自定义异常熔断器5.Hystrix仪表盘监控三、测试1. 异常熔断2. 超时熔断3. 熔断器获得异常4. 异常忽略5. 自定义异常熔断器一、概念 故障蔓延&#xff1a;由于一个服务变慢或没有响应导致大量请求堆积&#xff0c;进…

android中如何使用一张图片适配不同尺寸的APP引导页

在我们平常开发的过程中在做引导页适配的时候&#xff0c;有时候会犯难&#xff0c;怎么样作图可以将各种不同尺寸分辨率的手机都适配好也就是不变形不拉伸&#xff0c;官方给的说法也只是做多套图去适配不同的分辨率&#xff0c;遇到全屏展示引导这种问题的时候就有些力不从心…

还在用Tensorboard?机器学习实验管理平台大盘点

文 | SisyphusBJ源 | Pytorch Lightningwandb.aicomet.mlneptune.aiallegro trainsmlflowguild.aisacredtest-tubetensorboard相信很多同学看到上面这个列表的第一印象是懵的。我们先看下机器学习实验管理平台 到底是做神马滴&#xff1a;一句话概括就是&#xff1a;&#xff0…

论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为跨语言知识图谱问答。来源&#xff1a;NAACL2019链接&#xff1a;https://arxiv.org/pdf/1904.02342.pdf本文关注如何从信息抽取结果&#xff08;特别是知识图谱&#xff09;出发&#xff0c;生…

LeetCode 230. 二叉搜索树中第K小的元素(中序遍历)

文章目录1. 题目信息2. 解题2.1 中序递归2.2 中序循环写法1. 题目信息 给定一个二叉搜索树&#xff0c;编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明&#xff1a; 你可以假设 k 总是有效的&#xff0c;1 ≤ k ≤ 二叉搜索树元素个数。 示例 1:输入: root …

Apache Doris在美团外卖数仓中的应用实践

序言 美团外卖数据仓库技术团队负责支撑日常业务运营及分析师的日常分析&#xff0c;由于外卖业务特点带来的数据生产成本较高和查询效率偏低的问题&#xff0c;他们通过引入Apache Doris引擎优化生产方案&#xff0c;实现了低成本生产与高效查询的平衡。并以此分析不同业务场景…

Feign 简介和使用

声明式服务消费Feign一、简介二、使用Feign实现服务消费者三、实现普通的服务提供者四、Feign服务调用测试五、Feign消费者测试负载均衡服务熔断一、简介 Feign是Netflix公司开发的一个声明式的REST调用客户端&#xff1b; Ribbon负载均衡、Hystrix服务熔断是我们Spring Cloud…

论文浅尝 | 面向自动问题生成的跨语言训练

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为跨语言知识图谱问答。来源&#xff1a;ACL 2019链接&#xff1a;https://128.84.21.199/pdf/1906.02525.pdf动机现有问题生成方法需要大量的“文本-问题”有标注数据对作为训练数据集&#xff…

再见,Spark!Flink已成气候!

身为大数据工程师&#xff0c;你还在苦学Spark、Hadoop、Storm&#xff0c;却还没搞过Flink&#xff1f;醒醒吧&#xff01;刚过去的2020双11&#xff0c;阿里在Flink实时计算技术的驱动下全程保持了“如丝般顺滑”&#xff0c;基于Flink的阿里巴巴实时计算平台简直强无敌。最恐…

Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展&#xff0c;摩尔定律逐渐失效&#xff0c;多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池&#xff1a;ThreadPoolExecutor类&#xff0c;帮助开发人员管理线程并方便地执行并行任务。了解并合理使…

Zuul 简介和使用

Zuul背景Zuul的作用Zuul API网关Zuul请求过滤Zuul路由规则Zuul异常处理背景 通过之前的学习&#xff0c;我们知道注册中心Eureka&#xff0c;可以讲服务注册到该注册中心&#xff0c;Ribbon和Feign可以实现服务负载均衡地调用&#xff0c;Hystrix可以实现服务熔断&#xff0c;…

技术动态 | 知识图谱上的实体链接

本文转载自公众号&#xff1a;知识工场 1、什么是实体链接实体链接&#xff08;entity linking&#xff09;就是将一段文本中的某些字符串映射到知识库中对应的实体上。比如对于文本“郑雯出任复旦大学新闻学院副院长”&#xff0c;就应当将字符串“郑雯”、“复旦大学…

卖萌屋学术站开放注册啦!寻募种子用户,超多特权放出!

文&#xff1a;夕小瑶消失一个多月的小夕又突然出现啦&#xff01;要问小夕最近业余时间在做什么&#xff0c;那就是跟小伙伴们开发学术站啦~&#xff08;等...等再肝一版&#xff0c;小夕就继续给大家写文章(&#xff61; ́︿ ̀&#xff61;)众所周知&#xff0c;卖萌屋学术…

LeetCode 11. 盛最多水的容器(双指针)

文章目录1. 题目信息2. 解题1. 题目信息 给定 n 个非负整数 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。 在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。 找出其中的两条线&#xff0c;…

WSDM Cup 2020检索排序评测任务第一名经验总结

1.背景 第13届“国际网络搜索与数据挖掘会议”(WSDM 2020)于2月3日在美国休斯敦召开&#xff0c;该会议由SIGIR、SIGKDD、SIGMOD和SIGWEB四个专委会共同协调筹办&#xff0c;在互联网搜索、数据挖掘领域享有很高学术声誉。本届会议论文录用率仅约15%&#xff0c;并且WSDM历来注…

ltp︱基于ltp的无监督信息抽取模块

ltp︱基于ltp的无监督信息抽取模块&#xff1a;https://zhuanlan.zhihu.com/p/44890664 &#xfeff;无监督信息抽取较多都是使用哈工大的ltp作为底层框架。那么基于ltp其实有了非常多的小伙伴进行了尝试&#xff0c;笔者私自将其归纳为&#xff1a;事件抽取&#xff08;三元组…

Eureka 简介和使用

Eureka 服务注册与发现服务注册与发现Eureka与Zookeeper的比较ZooKeeper保证CPEureka保证APEureka是什么&#xff1f;Eureka原理SpringBoot、Spring Cloud 和 Eureka 版本选择Eureka单机搭建搭建Eureka服务端搭建Eureka客户端的服务提供者搭建Eureka客户端的服务消费者Eureka集…

论文浅尝 | XQA:一个跨语言开放域问答数据集

论文笔记整理&#xff1a;刘晓臻&#xff0c;东南大学计算机科学与工程学院本科生。Citation: Liu, J., Lin, Y., Liu, Z., & Sun, M. (2019,July). XQA: A Cross-lingual Open-domain Question Answering Dataset. InProceedings of the 57th Conference of the Associati…