2012-01-26 62 views
9

我在某些代碼中遇到了numpy.apply_along_axis函數。我不明白關於它的文檔。numpy.apply_along_axis究竟執行什麼操作?

這是文檔的一個示例:

>>> def new_func(a): 
...  """Divide elements of a by 2.""" 
...  return a * 0.5 
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) 
>>> np.apply_along_axis(new_func, 0, b) 
array([[ 0.5, 1. , 1.5], 
     [ 2. , 2.5, 3. ], 
     [ 3.5, 4. , 4.5]]) 

據我作爲以爲我理解的文檔,我會預期:

array([[ 0.5, 1. , 1.5], 
     [ 4 , 5 , 6 ], 
     [ 7 , 8 , 9 ]]) 

即具有沿軸線施加的函數[1,2,3]這是軸 in [[1,2,3],[4,5,6],[7,8,9]]

顯然我錯了。你能糾正我嗎?

回答

9

apply_along_axis沿輸入數組的一維切片應用提供的功能,沿着您指定的軸切割切片。因此,在您的示例中,new_func將沿着第一個軸應用於陣列的每個切片上。

In [20]: b = np.array([[1,2,3], [4,5,6], [7,8,9]]) 

In [21]: np.apply_along_axis(np.diff,0,b) 
Out[21]: 
array([[3, 3, 3], 
     [3, 3, 3]]) 

In [22]: np.apply_along_axis(np.diff,1,b) 
Out[22]: 
array([[1, 1], 
     [1, 1], 
     [1, 1]]) 

這裏,numpy.diff沿着任一所述輸入陣列的第一或第二軸(尺寸)的每個切片應用:如果使用矢量值函數,而不是一個標量,這樣它變得更清晰。

2

該函數在axis = 0的一維數組上執行。您可以使用「軸」參數指定另一個軸。這種模式的用法是:沿尺寸0,所以,它是指一維函數對每個子陣列進行

np.apply_along_axis(np.cumsum, 0, b) 

的功能,並返回每個1D輸入一維數組。

另一個實例是:

np.apply_along_axis(np.sum, 0, b) 

提供用於1-d陣列的標量輸出。 當然,您可以在cumsum或sum中設置軸參數來完成上述操作,但這裏的要點是它可以用於您編寫的任何1-D函數。