2016-07-04 118 views
1

我需要比較一堆具有不同尺寸numpy的陣列,說:未知尺寸的Numpy索引數組?

a = np.array([1,2,3]) 
b = np.array([1,2,3],[4,5,6]) 
assert(a == b[0]) 

我怎樣才能做到這一點,如果我不知道的任何形狀和b,除此之外

len(shape(a)) == len(shape(b)) - 1 

,我也不知道哪個維度從b跳過。我想使用np.index_exp,但似乎並沒有幫助我...

def compare_arrays(a,b,skip_row): 
    u = np.index_exp[ ... ] 
    assert(a[:] == b[u]) 

編輯 或者把它,否則,我wan't構建切片,如果我知道的形狀數組和我想錯過的維度。我如何動態創建np.index_exp,如果我知道尺寸和位置的數量,放置「:」的位置以及放置「0」的位置。

+0

是np.take你在找什麼? –

+0

謝謝,np.take似乎在給定的軸上工作。我可以使用它,但我如何給「:」來定義範圍? – kakk11

+0

'skip row'或line是什麼意思?或者你的意思是跳過一個維度? – hpaulj

回答

1

我只是在查看apply_along_axisapply_over_axis的代碼,研究它們如何構建索引對象。

讓我們做一個四維陣列:

In [355]: b=np.ones((2,3,4,3),int) 

使slices列表(使用列表*重複)

In [356]: ind=[slice(None)]*b.ndim 

In [357]: b[ind].shape # same as b[:,:,:,:] 
Out[357]: (2, 3, 4, 3) 

In [358]: ind[2]=2  # replace one slice with index 

In [359]: b[ind].shape # a slice, indexing on the third dim 
Out[359]: (2, 3, 3) 

或與您的例子

In [361]: b = np.array([1,2,3],[4,5,6]) # missing [] 
... 
TypeError: data type not understood 

In [362]: b = np.array([[1,2,3],[4,5,6]]) 

In [366]: ind=[slice(None)]*b.ndim  
In [367]: ind[0]=0 
In [368]: a==b[ind] 
Out[368]: array([ True, True, True], dtype=bool) 

這個索引基本上是與np.take相同,但同樣的想法可以擴展到其他ca SES。

我不完全按照你的問題使用:。請注意,在構建索引列表時,我使用slice(None)。口譯員將所有索引:翻譯爲slice對象:[start:stop:step] => slice(start, stop, step)

通常你不需要使用a[:]==b[0]; a==b[0]就足夠了。使用列表alist[:]進行復制,數組不做任何操作(除非在RHS上使用,a[:]=...)。

+0

非常感謝。看起來我並不知道「slice()」的構造,因爲我確實可以構建任何類型和任何維度索引,完美! – kakk11