2017-07-17 205 views
0

Here已經是在numpy數組中插入一個元素的答案,其中np.concatenate()主宰np.insert()np.concatenate()np.insert()佔用更少的時間)。但我無法使用它將元素插入多個位置。這裏是一個例子 -如何使用np.concatenate()在numpy數組中插入多個元素?

cell = np.array([1, 4, 4, 5, 5, 2, 5, 1, 1, 5]) 
place = np.argwhere(cell == np.amax(cell)).flatten().tolist() 
cell = np.insert(cell, place, 0) 

我怎樣才能使用np.concatenate()相同?

+0

對於樣品,'place'是空的。那個命令應該爲'place'做些什麼? – Divakar

+0

@Divakar我的壞。現在我已經糾正它。 –

+0

查看'np.insert'的代碼(例如源文件)。它根據插入點的數量使用不同的策略。雖然可能性很多,但基本原理很簡單。 – hpaulj

回答

0
In [178]: cell = np.array([1, 4, 4, 5, 5, 2, 5, 1, 1, 5]) 
In [179]: place = np.argwhere(cell == np.amax(cell)).flatten().tolist() 
In [180]: place 
Out[180]: [3, 4, 6, 9] 
In [181]: np.insert(cell, place, 0) 
Out[181]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5]) 
In [182]: np.concatenate([cell[:3],[0],cell[3:4],[0],cell[4:6],[0],cell[6:9],[0] ,cell[9:]]) 
Out[182]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5]) 

構建concatante列表可以用某種列表遍歷所有place值一概而論。詳情留給讀者。

insert,與多個插入,使用mask的做法,我們可以逆向工程:

哪裏它插入0?

In [193]: res = np.insert(cell, place, 0) 
In [194]: np.where(res==0) 
Out[194]: (array([ 3, 5, 8, 12], dtype=int32),) 

這與加入0,1,2,3放置:

In [195]: np.arange(n)+place 
Out[195]: array([ 3, 5, 8, 12]) 

使目標陣列和掩模陣列:

In [196]: out = np.zeros(len(cell)+n, dtype=cell.dtype) 
In [197]: mask = np.ones(len(out), dtype=bool) 

使用掩模,以限定我們插入原始值

In [198]: mask[Out[195]]=False 
In [199]: out[mask] = cell 
In [200]: out 
Out[200]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5]) 

Sin插入值爲0,我們不需要再做任何事情。

我在之前的回答中建議concatenate比插入更快,因爲insert比較通用,需要更多時間來設置。這可能也是如此。但我不指望在時間上有所改善。


廣義串連

In [235]: catlist = [cell[:place[0]],[0]] 
In [236]: for i in range(n-1): 
    ...:  catlist.append(cell[place[i]:place[i+1]]) 
    ...:  catlist.append([0]) 
    ...:  
In [237]: catlist.append(cell[place[-1]:]) 
In [238]: np.concatenate(catlist) 
Out[238]: array([1, 4, 4, 0, 5, 0, 5, 2, 0, 5, 1, 1, 0, 5]) 
+0

謝謝。這是一個很好的方法,但問題是我必須處理10^18個元素,這就是爲什麼我要實現'concatenate()',否則我可以使用insert()。如果你有更好的解決方案,比insert()需要更少的時間,那對我來說會很有幫助。我嘗試過'for'循環的'concatenate()',但用於插入一個元素需要將近500秒(對於10^9個元素)。再一次感謝你。 –

+0

如果'cell'與'place'相比較大,我期望'concatenate'方法(參見我的上次編輯)會更快,因爲它可以處理大片「cell」。但是如果切片很小而且很多,那麼'insert'完成的蒙版複製可能會更快。 – hpaulj

+0

我剛剛嘗試了你在上次編輯中所說的內容。正如你所說,這裏的地方不小。所以'insert'會幫助我。謝謝。 –

相關問題