A,B,C,D,E,F是6个网格点,坐标如图,如何用矩阵形式(坐标矩阵)来批量描述这些点的坐标呢?
答案如下
这就是坐标矩阵——横坐标矩阵X XX中的每个元素,与纵坐标矩阵Y YY中对应位置元素,共同构成一个点的完整坐标。如B点坐标(X12,Y12)=(1,1)
语法:X,Y = numpy.meshgrid(x, y)
输入的x,y,就是网格点的横纵坐标列向量(非矩阵)
输出的X,Y,就是坐标矩阵。
stack()函数
函数原型为:stack(arrays, axis=0),arrays可以传数组和列表。axis的含义我下面会讲解,我们先来看个例子,然后我会分析输出结果。
import numpy as np a=[[1,2,3], [4,5,6]] print("列表a如下:") print(a) print("增加一维,新维度的下标为0") c=np.stack(a,axis=0) print(c) print("增加一维,新维度的下标为1") c=np.stack(a,axis=1) print(c) 输出: 列表a如下: [[1, 2, 3], [4, 5, 6]] 增加一维,新维度下标为0 [[1 2 3] [4 5 6]] 增加一维,新维度下标为1 [[1 4] [2 5] [3 6]]
例如上面的代码中a列表中的第一个元素为[1,2,3],那么当axis=0的时候,就是在它的中括号外面再加一个中括号,变成[ [1,2,3] ](其实1,2,3之间是没有逗号的,因为stack()函数会先把参数arrays中的每个元素变成numpy的数组,数组之间是没有逗号的,看看上面的代码输出就知道了,这里大家明白就行,我为了方便讲解,下面还会加上逗号),这样最外面那层中括号才代表维度下标为0的那维;当axis=1的时候,就是在里面加个中括号,变成了[ [1],[2],[3] ],这样里面加的那层中括号才代表维度下标为1的那维。同理当axis=0的时候[4,5,6]变成[ [ 4,5,6] ],当axis=1的时候,变成[ [4],[5],[6] ]。下面我们讲如何把增加一维度后的每个元素串起来。
怎么把上面那两个元素增加维度后的结果串起来呢,其实很简单。现在我们已经知道了增加维度无非是增加中括号的意思,至于在哪里加中括号,取决于axis等于几。我们把增加的中括号想像成一个个的箱子。还拿上面的代码来说,当axis=0的时候,我们把套在[1,2,3]外面的中括号(就是[ [1,2,3] ]最外层的那个中括号)看做是箱子A,这个箱子A也会套在[4,5,6]的外面,所以我们就先把[1,2,3]和[4,5,6]放在一起,变成[1,2,3],[4,5,6],然后再一起套上箱子A,变成[ [1,2,3],[4,5,6] ]这就是当axis=0的时候程序的输出结果。
现在再来看当axis=1的时候,对于[1,2,3],我们把套在1外面的箱子(就是上面讲的[ [1],[2],[3] ]中1外面的那层中括号)看做A,套在2外面的看做B,套在3外面的看做C,同理,箱子A也会套在4的外面,箱子B也会套在5的外面,箱子C也会套在6的外面。那么我们就把1和4放一起,2和5放一起,3和6放一起,变成[ 1,4 ,2,5 ,3,6 ]然后把箱子A,B,C分别套在1,4 , 2,5 , 3,6的外面,变成[ [1,4] , [2,5] , [3,6] ]这就是程序中axis=1的时候程序的输出结果。
大家发现了没有,串起来的时候其实就是把arrays中每个元素在相同的位置套箱子的一些小块(这里叫小块这个名词可能不洽当,但是大家明白就行)放在一起后,再套箱子,就是外面套个中括号,这就是堆叠。
1 import numpy as np 2 a=[[1,2,3], 3 [4,5,6]] 4 b=[[1,2,3], 5 [4,5,6]] 6 c=[[1,2,3], 7 [4,5,6]] 8 print("a=",a) 9 print("b=",b) 10 print("c=",c) 11 12 print("增加一维,新维度的下标为0") 13 d=np.stack((a,b,c),axis=0) 14 print(d) 15 16 print("增加一维,新维度的下标为1") 17 d=np.stack((a,b,c),axis=1) 18 print(d) 19 print("增加一维,新维度的下标为2") 20 d=np.stack((a,b,c),axis=2) 21 print(d) 22 23 输出: 24 ('a=', [[1, 2, 3], [4, 5, 6]]) 25 ('b=', [[1, 2, 3], [4, 5, 6]]) 26 ('c=', [[1, 2, 3], [4, 5, 6]]) 27 增加一维,新维度的下标为0 28 [[[1 2 3] 29 [4 5 6]] 30 31 [[1 2 3] 32 [4 5 6]] 33 34 [[1 2 3] 35 [4 5 6]]] 36 增加一维,新维度的下标为1 37 [[[1 2 3] 38 [1 2 3] 39 [1 2 3]] 40 41 [[4 5 6] 42 [4 5 6] 43 [4 5 6]]] 44 增加一维,新维度的下标为2 45 [[[1 1 1] 46 [2 2 2] 47 [3 3 3]] 48 49 [[4 4 4] 50 [5 5 5] 51 [6 6 6]]] 52 --------------------- 53 作者:neu_张康 54 来源:CSDN 55 原文:https://blog.csdn.net/csdn15698845876/article/details/73380803 56 版权声明:本文为博主原创文章,转载请附上博文链接!
当axis=0的时候,列表a,b,c最外面都需要套箱子(就是加中括号),那么我把你们先放一起,变成下面这样
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]]
然后在最外面套箱子,变成
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[ [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]] ]
当axis=1的时候,列表a,b,c中的[1,2,3]需要套同样的箱子,列表a,b,c中的[4,5,6]需要套同样的箱子,好,我先把你们放一块变成下面这样
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[ [1,2,3],[1,2,3],[1,2,3] , [4,5,6],[4,5,6],[4,5,6] ]
然后开始分别在 [1,2,3],[1,2,3],[1,2,3]的外面和[4,5,6],[4,5,6],[4,5,6]的外面套箱子,变成下面这样
[ [[1,2,3],[1,2,3],[1,2,3]] , [[4,5,6],[4,5,6],[4,5,6]] ]
当axis=2的时候,列表a,b,c中的1,2,3,4,5,6都需要套箱子,我把你们先放一起变成:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
[ [1,1,1 , 2,2,2 , 3,3,3], [4,4,4 , 5,5,5 , 6,6,6] ]
然后在1,1,1 ………6,6,6的外面分别套箱子变成:
[ [[1,1,1] , [2,2,2] , [3,3,3]], [[4,4,4] , [5,5,5] , [6,6,6]] ]
重点:
np.meshgrid生成的坐标矩阵可以用np.stack指定axi还原各个点坐标
举例:
generate anchors 中频繁使用np.meshgrid,最后用np.stack将shift_x,shift_y stack ,返回每一个anchor的值
原文:https://blog.csdn.net/csdn15698845876/article/details/73380803
版权声明:本文为博主原创文章,转载请附上博文链接!
来源:https://blog.csdn.net/lllxxq141592654/article/details/81532855