5
讓我們以3D陣列爲例。或者更容易形象化的立方體。從(n)D陣列中選擇n-1個(n-1)D陣列
我想選擇該立方體的所有面。我想將其推廣到任意維度。
我還想然後添加/刪除面的立方體(cuboid),並泛化爲任意維。
我知道對於每個固定數量的維度你可以做array[:,:,0], array[-1,:,:]
我想知道如何推廣到任意維度以及如何輕鬆遍歷所有面。
讓我們以3D陣列爲例。或者更容易形象化的立方體。從(n)D陣列中選擇n-1個(n-1)D陣列
我想選擇該立方體的所有面。我想將其推廣到任意維度。
我還想然後添加/刪除面的立方體(cuboid),並泛化爲任意維。
我知道對於每個固定數量的維度你可以做array[:,:,0], array[-1,:,:]
我想知道如何推廣到任意維度以及如何輕鬆遍歷所有面。
爲了得到一張臉:
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]]
謝謝,我得到它的工作。 – csiz
除了巴斯的回答,在'訪問numpy'一個常見的成語,以任意軸(例如'somefunc(somearray,axis = n)')是使用'swapaxes'來切換指定的軸與數組中的第一個軸,然後在「交換」結果的第一個軸上進行操作。 'swapaxes'顯示視圖,因此不會使用額外的內存。 –