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])
對於樣品,'place'是空的。那個命令應該爲'place'做些什麼? – Divakar
@Divakar我的壞。現在我已經糾正它。 –
查看'np.insert'的代碼(例如源文件)。它根據插入點的數量使用不同的策略。雖然可能性很多,但基本原理很簡單。 – hpaulj