2016-07-25 36 views
2

我想了解以下Python細分。關於設置ogrid和fillup在numpy中相應的多維數組

def upsample_filt(size): 
    factor = (size + 1) // 2 
    if size % 2 == 1: 
     center = factor - 1 
    else: 
     center = factor - 0.5 
    og = np.ogrid[:size, :size] 
    return (1 - abs(og[0] - center)/factor) * \ 
      (1 - abs(og[1] - center)/factor) 

根據numpyogrid returns a mesh-grid ndarrys with only one dimension.I think the program want to generate尺寸*尺寸array. Why is it be written as OG = np.ogrid [:大小,:尺寸] Or what does:size`意思?

作爲一個測試,我設置size=4,並且print((1 - abs(og[0] - center)/factor)*(1 - abs(og[1] - center)/factor)),輸出如下:

[[ 0.0625 0.1875 0.1875 0.0625] 
[ 0.1875 0.5625 0.5625 0.1875] 
[ 0.1875 0.5625 0.5625 0.1875] 
[ 0.0625 0.1875 0.1875 0.0625]] 

我不是很清楚怎麼做(1 - abs(og[0] - center)/factor)*(1 - abs(og[1] - center)/factor) fillup這個多維數組?

回答

1

讓我們變得更爲簡單:

In [264]: og=np.ogrid[:3,:2] 
In [265]: og 
Out[265]: 
[array([[0], 
     [1], 
     [2]]), array([[0, 1]])] 

這些2 (3,1)(1,2)形狀。他們是2d; 'o'表示'開放'。

In [266]: og[0]*og[1] 
Out[266]: 
array([[0, 0], 
     [0, 1], 
     [0, 2]]) 

他們廣播在一起形成(3,2)陣列

(3,1),(1,2)=>(3,2),(3,2)=>( 3,2)

看什麼mgrid生產:

In [271]: np.mgrid[:3,:2] 
Out[271]: 
array([[[0, 0], 
     [1, 1], 
     [2, 2]], 

     [[0, 1], 
     [0, 1], 
     [0, 1]]]) 

2(3,2)的陣列,其產生相同的組合

ogridmgrid是具有唯一索引方法的類對象。 [:3, :2]將Python視爲常規索引。

meshgrid產生同樣的事情,但與常規的函數的語法

In [275]: np.meshgrid(np.arange(3), np.arange(2),sparse=True,indexing='ij') 
Out[275]: 
[array([[0], 
     [1], 
     [2]]), array([[0, 1]])] 

執行相同的計算的另一種方法 - 通過使用[:,None]打開第一範圍爲(3,1)陣列。這裏,廣播是(3,1),(2,)=>(3,1),(1,2)=>(3,2)

In [276]: np.arange(3)[:,None]*np.arange(2) 
Out[276]: 
array([[0, 0], 
     [0, 1], 
     [0, 2]]) 

========= ==========

(1 - abs(og[0] - center)/factor) * 
(1 - abs(og[1] - center)/factor) 

這只是縮放2個範圍和它們放在一起它們相乘

In [292]: a=(1-abs(np.arange(4)-1.5)/2) 
In [293]: a[:,None]*a 
Out[293]: 
array([[ 0.0625, 0.1875, 0.1875, 0.0625], 
     [ 0.1875, 0.5625, 0.5625, 0.1875], 
     [ 0.1875, 0.5625, 0.5625, 0.1875], 
     [ 0.0625, 0.1875, 0.1875, 0.0625]]) 
+0

感謝您的解釋。 – user297850