2016-07-25 85 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