np.meshgrid()用法+ np.stack()用法


 

 

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最外面都需要套箱子(就是加中括號),那么我把你們先放一起,變成下面這樣

[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]]
View Code

然后在最外面套箱子,變成

[
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]],
[[1,2,3],[4,5,6]]
]
View Code

當axis=1的時候,列表a,b,c中的[1,2,3]需要套同樣的箱子,列表a,b,c中的[4,5,6]需要套同樣的箱子,好,我先把你們放一塊變成下面這樣

[
    [1,2,3],[1,2,3],[1,2,3]
    ,
    [4,5,6],[4,5,6],[4,5,6]

]
View Code

然后開始分別在 [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都需要套箱子,我把你們先放一起變成:

[
    [1,1,1  ,  2,2,2  , 3,3,3],
    [4,4,4  ,  5,5,5  , 6,6,6]
]
View Code

然后在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM