這是一種方法。 n
是結果中的列數。行數由len(arr)
決定。
In [29]: n = 5
In [30]: arr = np.array([1, 2, 3, 0, 3])
In [31]: (np.arange(n) >= arr[:, np.newaxis]).astype(int)
Out[31]:
array([[0, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1]])
有兩個部分是如何工作的解釋。首先,如何創建一個與m
零和n-m
的行?爲此,我們使用np.arange
創建具有值的行[0,1,...,N-1]`:
In [35]: n
Out[35]: 5
In [36]: np.arange(n)
Out[36]: array([0, 1, 2, 3, 4])
接下來,該數組比較m
:
In [37]: m = 2
In [38]: np.arange(n) >= m
Out[38]: array([False, False, True, True, True], dtype=bool)
那給出一組布爾值;第一個m
的值爲False,其餘爲True。鑄造這些價值觀爲整數,我們得到的0和1組成的數組:
In [39]: (np.arange(n) >= m).astype(int)
Out[39]: array([0, 0, 1, 1, 1])
要執行這種過度的陣列m
的值(你arr
),我們使用broadcasting;這是解釋的第二個關鍵想法。
注什麼arr[:, np.newaxis]
給出:
In [40]: arr
Out[40]: array([1, 2, 3, 0, 3])
In [41]: arr[:, np.newaxis]
Out[41]:
array([[1],
[2],
[3],
[0],
[3]])
即,arr[:, np.newaxis]
重塑arr
成2 d陣列形狀(5,1)。 (arr.reshape(-1, 1)
本來是用來代替。)現在,當我們比較這對np.arange(n)
(1-d數組長度n
),在廣播踢:
In [42]: np.arange(n) >= arr[:, np.newaxis]
Out[42]:
array([[False, True, True, True, True],
[False, False, True, True, True],
[False, False, False, True, True],
[ True, True, True, True, True],
[False, False, False, True, True]], dtype=bool)
由於@RogerFan在他的評論中指出,這是基本參數的外積,使用>=
操作。
最後投鍵入int
給出期望的結果:
In [43]: (np.arange(n) >= arr[:, np.newaxis]).astype(int)
Out[43]:
array([[0, 1, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 0, 1, 1]])
爲什麼我沒有想到這個? ;-)感謝發佈。 (+1) – NPE 2014-09-30 21:38:28
非常感謝!解釋可能對未來訪問者有用(儘管你現在可能只是在努力)。 – PascalVKooten 2014-09-30 21:39:48
實際上,我沒有使用方矩陣;( – PascalVKooten 2014-09-30 21:44:48