2013-11-25 53 views
2

我需要能夠返回一個多維數組的一部分,但我不知道如何以正確的方式做到這一點。我做的方式似乎很天真:如何在Python中返回多維數組的子數組?

import numpy as np 
a=np.ones([3,3,3,3,3]) 
b=np.asarray([2,2]) 
c=np.asarray([2,2]) 
print a[b[0],b[1],:,c[0],c[1]] 

,並返回

[1,1,1] 

不過我想是這樣的:

a=np.ones([3,3,3,3,3]) 
b=np.asarray([2,2]) 
c=np.asarray([2,2]) 
print a[b,:,c] 

它返回a本身,雖然我希望它返回[1,1,1]

我不知道爲什麼。我怎樣才能讀取一個數組的一部分,而不指定元素的元素,但給我想要作爲一個包的數組的索引?

P.S.感謝@ hcwhsa,我更新了問題以更具體地解決我想要的問題。

+0

你想要什麼第二件事返回?特別是,你希望'a [b,:,c] .shape'是什麼? – user2357112

+0

@ user2357112同樣的事情,即'[1,1,1]'只是用這種新的方式調用 – Cupitor

+0

你的用例是什麼?爲什麼你有這些'b'和'c'陣列? – user2357112

回答

1

我能想到的兩種方法可以做到這一點,也不是完美的前轉換爲tuple。一個是推出你想要得到的,以結束所有軸:(!在索引移軸數小心)

ax = 2 # the axis you want to have all values in 
np.rollaxis(a, ax, a.ndim)[tuple(np.r_[b,c])] 

本工程爲a[b,:,:,c]如果移動兩軸到後

np.rollaxis(np.rollaxis(a, ax, a.ndim), ax, a.ndim)[tuple(np.r_[b,c])] 

其中np.rollaxis(a, ax, a.ndim)移動ax要將所有的保持到最後軸:

a = np.zeros((1,2,3,4,5)) 
a.shape 
#(1,2,3,4,5) 
np.rollaxis(a, ax, a.ndim).shape 
#(1,2,4,5,3) 

而且np.r_[b,c]只是孔卡tentes這兩個陣列。你也可以這樣做:tuple(np.concatenate([b,c]))


或者,你可以使用從我的意見之一:

a[tuple(b) + (slice(None),) + tuple(c)] 

其中slice是,start:end:step語法創建的對象。 None爲您提供:,但您可以動態創建它(無需在正確的位置輸入:)。所以,a[1:3]相當於a[slice(1,3)],a[:3]a[slice(None,3)]。我將它包裝在一個元組中,以便它可以「添加」到其他兩個元組中以創建一個長元組。

2

定義b作爲一個元組:

>>> b = (2, 2) 
>>> a[b] 
array([ 1., 1., 1.]) 

或者它它傳遞給a[]

>>> b = np.asarray([2,2]) 
>>> a[tuple(b)] 
array([ 1., 1., 1.]) 
+0

謝謝。投票。但在我的代碼中,b是數組而不是元組,而「元組(map(tuple,arr))」在這裏不起作用。 – Cupitor

+1

@Naji查看我的更新答案。 –

+0

那麼我的維度更高,我需要的子數組例如: 'a [b,:,:,c]' 哪裏'b'和'c'是數組? – Cupitor