2013-11-21 218 views
5

讓我們以3D陣列爲例。或者更容易形象化的立方體。從(n)D陣列中選擇n-1個(n-1)D陣列

我想選擇該立方體的所有面。我想將其推廣到任意維度。

我還想然後添加/刪除面的立方體(cuboid),並泛化爲任意維。

我知道對於每個固定數量的維度你可以做array[:,:,0], array[-1,:,:]我想知道如何推廣到任意維度以及如何輕鬆遍歷所有面。

+2

除了巴斯的回答,在'訪問numpy'一個常見的成語,以任意軸(例如'somefunc(somearray,axis = n)')是使用'swapaxes'來切換指定的軸與數組中的第一個軸,然後在「交換」結果的第一個軸上進行操作。 'swapaxes'顯示視圖,因此不會使用額外的內存。 –

回答

4

爲了得到一張臉:

def get_face(M, dim, front_side): 
    if front_side: 
     side = 0 
    else: 
     side = -1 
    index = tuple(side if i == dim else slice(None) for i in range(M.ndim)) 
    return M[index] 

要添加一個面(未經測試):

def add_face(M, new_face, dim, front_side): 
    #assume sizes match up correctly 
    if front_side: 
     return np.concatenate((new_face, M), dim) 
    else: 
     return np.concatenate((M, new_face), dim) 

要刪除的臉:

def remove_face(M, dim, front_side): 
    if front_side: 
     dim_slice = slice(1, None) 
    else: 
     dim_slice = slice(None, -1) 
    index = tuple(dim_slice if i == dim else slice(None) for i in range(M.ndim)) 
    return M[index] 

遍歷所有的面:

def iter_faces(M): 
    for dim in range(M.ndim): 
     for front_side in (True, False): 
      yield get_face(M, dim, front_side) 

一些快速測試:

In [18]: M = np.arange(27).reshape((3,3,3)) 
In [19]: for face in iter_faces(M): print face 
[[0 1 2] 
[3 4 5] 
[6 7 8]] 
[[18 19 20] 
[21 22 23] 
[24 25 26]] 
[[ 0 1 2] 
[ 9 10 11] 
[18 19 20]] 
[[ 6 7 8] 
[15 16 17] 
[24 25 26]] 
[[ 0 3 6] 
[ 9 12 15] 
[18 21 24]] 
[[ 2 5 8] 
[11 14 17] 
[20 23 26]] 
+0

謝謝,我得到它的工作。 – csiz