可以延長starts
到2D
版本,並加入1D
範圍陣中,像這樣使用後broadcasting
-
x = starts[:,None] + np.arange(10)
說明
讓我們舉一個小例子爲starts
看什麼broadcasting
確實在這種情況下。
In [382]: starts
Out[382]: array([3, 1, 3, 2])
In [383]: starts.shape
Out[383]: (4,)
In [384]: starts[:,None]
Out[384]:
array([[3],
[1],
[3],
[2]])
In [385]: starts[:,None].shape
Out[385]: (4, 1)
In [386]: np.arange(10).shape
Out[386]: (10,)
因此,看形狀,並把這些一起,同樣的示意圖會是這個樣子 -
starts : 4
np.arange(10) : 10
延伸starts
後:
starts[:,None] : 4 x 1
np.arange(10) : 10
因此,當我們將starts[:,None]
與np.arange(10)
相加時,starts[:,None]
的元素將沿其第二軸10
倍,對應於沿着該軸的另一個陣列的長度。對於np.arange(10)
,它將被轉換爲2D
,其第一個dim是一個單獨的dim,其中的elems沿着該軸廣播。4
times對應於沿該軸的另一個陣列starts[:,None]
的長度4
。請注意,沒有明確的複製,因爲在引擎蓋下方會廣播和添加元素。
因此,我們功能將有重複,像這樣 -
In [391]: np.repeat(starts[:,None],10,axis=1)
Out[391]:
array([[3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]])
In [392]: np.repeat(np.arange(10)[None],4,axis=0)
Out[392]:
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
這些廣播elems的,然後加入給我們所需的輸出x
。
正是我在找的東西。對於如何正確使用廣播,我仍然有點模糊。 –
@MadWombat看看添加的評論是否有意義。如果「廣播」的概念仍然沒有解決,我會建議自己查看文檔。 – Divakar