2016-09-21 54 views
0

我想列出具有隨機起點的整數序列。我會做這樣的純Python的方式是列出numpy中的範圍

 
x = np.zeros(1000, 10) # 1000 sequences of 10 elements each 
starts = np.random.randint(1, 1000, 1000) 
for i in range(len(x)): 
    x[i] = np.arange(starts[i], starts[i] + 10) 

我不知道是否有這樣做使用numpy的功能更優雅的方式。

回答

0

可以延長starts2D版本,並加入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

+0

正是我在找的東西。對於如何正確使用廣播,我仍然有點模糊。 –

+0

@MadWombat看看添加的評論是否有意義。如果「廣播」的概念仍然沒有解決,我會建議自己查看文檔。 – Divakar