2011-08-16 49 views
3

我希望快速(希望沒有for循環)產生以下形式的numpy的數組:在Python/numpy的分配多個數組索引一次

array([a,a,a,a,0,0,0,0,0,b,b,b,0,0,0, c,c,0,0....]) 

其中a,b,c和其它值在不同範圍的不同點重複。我真的在想這樣的事情:

import numpy as np 
a = np.zeros(100) 
a[0:3,9:11,15:16] = np.array([a,b,c]) 

這顯然不起作用。有什麼建議麼?

編輯(jterrace回答了原始問題): 數據以N * M Numpy數組的形式出現。每行大部分爲零,偶爾會穿插非零數字序列。 我想用序列的最後一個值替換每個這樣的序列的所有元素。我會採取任何快速的方法來做到這一點!使用where和diff幾次,我們可以得到每次運行的開始和結束索引。

raw_data = array([.....][....]) 
starts = array([0,0,0,1,1,1,1...][3, 9, 32, 7, 22, 45, 57,....]) 
stops = array([0,0,0,1,1,1,1...][5, 12, 50, 10, 30, 51, 65,....]) 
last_values = raw_data[stops] 
length_to_repeat = stops[1]-starts[1] 

請注意,開始[0]和停止[0]是相同的信息(運行發生在哪一行)。在這一點上,由於我所知道的唯一途徑就是jterrace的建議,我們需要通過一些扭曲來獲得類似的零點開始/停止位置,然後將零點開始/停止與開始/停止值交錯,並將數字0與last_values數組交錯。然後,我們循環每一行,執行類似的操作:

for i in range(N) 
    values_in_this_row = where(starts[0]==i)[0] 
    output[i] = numpy.repeat(last_values[values_in_this_row], length_to_repeat[values_in_this_row]) 

這是否有意義,還是我應該多解釋一下?

+0

什麼是輸入的形式?形式的元組(開始,停止,值)? – jterrace

回答

4

如果你有值且重複充分說明,你可以做這樣計數:

>>> import numpy 
>>> values = numpy.array([1,0,2,0,3,0]) 
>>> counts = numpy.array([4,5,3,3,2,2]) 
>>> numpy.repeat(values, counts) 
array([1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 3, 3, 0, 0]) 
+0

這正是我正在尋找的。謝謝! 現在,是否有辦法推進它,使: 'array([[a,a,a,a,0,0,0,0,0,b,b,b ,. ...], [0,0,0,c,c,0,0,dd,d,....]])' 正如你所想象的那樣,數據是以表格形式出現的(開始,停止,價值)。然而,它確實是在形式上(開始,停止,價值,渠道)。在每個頻道上循環播放可能是可以接受的,但如果可以進一步播放,爲什麼不呢? :-) Numpy.repeat似乎無法做到這一點。 – jeffalstott

+0

不太確定你的意思。如果您可以用確切的示例輸入和輸出來修改您的問題,那將會有所幫助。 – jterrace

0

您可以使用numpy.r_

>>> np.r_[[a]*4,[b]*3,[c]*2] 
array([1, 1, 1, 1, 2, 2, 2, 3, 3])