2016-12-15 78 views
1

我有一個函數,它將一個numpy數組(A)作爲輸入。根據數學計算,該數組可能是2d或3d數組。有一個整數m可以是任何數字,除非數組是2D時,m的值將始終爲0.我想將A的silce傳遞給另一個函數。由於A可以是3D或2D,我嘗試過3D風格切片。在二維numpy陣列中使用3D樣式切片

def fun(A): 
    ... some code 
    ans = fun2(A[:,:,m]) #The value of m is 0 if A is 2D 

這給了我一個IndexError當A是2D

IndexError: too many indices for array 

我想通過全二維數組FUN2如果A是2D的,像它在MATLAB發生。它如何在Python中完成?我使用Python 2

+0

根據需要(爲了= F)MATLAB自動在端部延伸的尺寸。 'numpy'在開始時進行擴展 - 至少在廣播時。但在索引環境中,像它不會添加索引。 – hpaulj

回答

2

似乎是個不錯的設置使用np.atleast_3d我們可以它是3D,然後簡單地切片第m個指數沿軸線最後,像這樣 -

np.atleast_3d(A)[...,m] # Or np.atleast_3d(A)[:,:,m] 

它仍然是數組的視圖,所以沒有效率損失!

的具體運行情況

1)2D:

In [160]: A = np.random.randint(11,99,(4,5)) 

In [161]: np.atleast_3d(A)[...,0] 
Out[161]: 
array([[13, 84, 38, 15, 26], 
     [64, 91, 29, 11, 48], 
     [25, 66, 77, 14, 87], 
     [59, 96, 98, 30, 88]]) 

In [162]: A 
Out[162]: 
array([[13, 84, 38, 15, 26], 
     [64, 91, 29, 11, 48], 
     [25, 66, 77, 14, 87], 
     [59, 96, 98, 30, 88]]) 

2)3D:

In [163]: A = np.random.randint(11,99,(4,3,5)) 

In [164]: np.atleast_3d(A)[...,1] 
Out[164]: 
array([[34, 81, 66], 
     [56, 20, 25], 
     [45, 36, 64], 
     [82, 64, 31]]) 

In [165]: A[:,:,1] 
Out[165]: 
array([[34, 81, 66], 
     [56, 20, 25], 
     [45, 36, 64], 
     [82, 64, 31]]) 
+1

注意'atleast_3d'對一維數組有什麼作用 - 它將一個形狀數組''(N,)'轉換爲'(1,N,1)',這可能不是你所期望的 – Eric

+1

@Eric好點!好的OP不能用於1D,如果有1D作爲輸入,預期的結果就不會被提及。我們應該通過數據傳遞的函數期望2D數據,這是我們用'np.atleast_3d'完成的,所以我猜測我們可能在那裏也行! – Divakar

+0

使用'np.atleast3d'只是隱藏決定是否執行'A [:,:m]'或'A [:,:newaxis] [:,:,m]'的邏輯。 – hpaulj