2012-06-05 58 views
1

我想標記沿數組的給定軸的所有最大值(該形狀可能是n維),這可以沿着第一個一個,但其餘的我無法弄清楚。我不想在軸上進行迭代,因爲可能有很多這樣的軸。匹配並標記沿numpy數組的給定軸的向量的元素的位置

>>> A = range(5)*3 
>>> A = array(a).reshape([3,5], order='F') 
>>> A 
array([[0, 3, 1, 4, 2], 
     [1, 4, 2, 0, 3], 
     [2, 0, 3, 1, 4]]) 
>>> B = amax(A, axis= 0) 
>>> C = amax(A, axis= 1) 
>>> B == A 
array([[False, False, False, True, False], 
     [False, True, False, False, False], 
     [ True, False, True, False, True]], dtype=bool) 

這就是我想要它做的:

>>> C == A 
False 

但(當然),它沒有。

如何讓此工作繼續?

回答

1

我終於想出了:

def tiletuple(t,axis): 
    m = [1]*t.ndim 
    m[axis] = t.shape[axis] 
    return m 

ax = 1 
tile(expand_dims(amax(A, axis=ax), axis=ax), tiletuple(A, ax)) == A 
1

在回答你的直接的例子,當你這樣做:

>>>A == C 
False 

它「不工作」,因爲numpy的不知道如何播放操作給你輸出你想要的。 使用轉兩次,你可以得到一個簡單的解決方案比你什麼建議:

>>>C = amax(A, axis=1) 
>>>transpose(C == transpose(A)) 
array([[False, False, False, True, False], 
     [False, True, False, False, False], 
     [False, False, False, False, True]], dtype=bool) 
+0

無論如何,我只是'虛假'回來。 – Sebastian

+0

是的我的壞我沒有得到你想要的東西。 我的解決方案現在可以工作,而且更簡單。 –

1

遲到了,但這個怎麼樣:

rollaxis(amax(A, ax)[...,newaxis], -1, ax) == A 

它基本上是再次插入軸,由於amax而落在陣列之外。然後,廣播再次工作。 或等同地:

a = list(A.shape) 
a[ax] = 1 
amax(A, ax).reshape(a) == A 
相關問題