2015-04-23 54 views
3

在比什麼,我需要一個小規模的基於索引的每列的一個特定的元素,這裏有什麼,我希望做一個例子:NumPy的:設置由數組

>>> a 
array([[ 21, 22, 23, 24, 25, 26, 27], 
     [ 56, 57, 58, 59, 60, 61, 62], 
     [ 14, 15, 16, 17, 18, 19, 20], 
     [ 7, 8, 9, 1010, 11, 12, 13], 
     [ 42, 43, 44, 45, 46, 47, 48], 
     [ 63, 64, 65, 66, 67, 68, 69], 
     [ 0, 1, 2, 3, 4, 5, 6], 
     [ 49, 50, 51, 52, 53, 54, 55], 
     [ 28, 29, 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39, 40, 41]]) 
>>> indices = a.argmax(axis=0) 
>>> indices 
array([5, 5, 5, 3, 5, 5, 5]) 
>>> b = np.zeros(a.shape) 
>>> b[indices] = 1.0 
>>> b # below is the actual output, not what I want 
array([[ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.]]) 

但我其實需要的是:

>>> b 
array([[ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 0., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.]]) 

numpy的索引可以得到極其複雜,這是一個有點難以投入到上述情況的話,那麼希望有人能明白我要找的。從本質上講,只要在其他地方存在最大值和零值的情況下設置1。我會如何去做這件事?

回答

4

docs

如果在選擇的元組對象的數量小於N,那麼 :假定對於任何後續的尺寸。

在您的選擇中,只有一個數組,因此您將索引中的每一行都等於1.爲了克服這個問題,您需要列索引。我想這將這樣的伎倆:

b[indices, np.arange(a.shape[1])] = 1.0 
+0

不錯:-)我知道有一個班輪地方 –

+0

啊哈, 謝謝!我覺得我現在理解numpy索引更好一點。 – mjois

+0

謝謝你。我來自MATLAB,所以'0:a.shape [1]'我認爲實際上會產生列索引,但是這會執行切片。在MATLAB中,':'運算符既進行切片,又生成一個索引向量,這是我的麻煩來自的地方。現在我知道我必須手動生成列索引。謝謝! – rayryeng

0

有可能是沒有環的方式,但你總是可以做:

indices = a.argmax(axis=0) 
b = np.zeros(a.shape) 
for j,ind in enumerate(indices): 
    b[ind, j] = 1 
相關問題