2014-10-22 29 views
1

我試圖結合numpy數組切片和高級索引失敗。例如,我有填充有1/0的python Numpy結合切片和高級索引

r = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 

我找到非零元素的索引一個numpy的數組:

(nz,) = np.nonzero(r) 

然後我想用非零個索引的陣列操作上我的數組r。對於r中的每個索引,我想在r中向前着色一個範圍(在下面的5個值中)。像 -

r[nz,:nz:nz+5] = 255 

其給出結果:

陣列([0,0,255,255,0,255,0,0,255,0,255,0,0, 0, 0,0,0,0,0,0])

我會然而預料以下:

陣列([0,0,255,255,255,255,255,255,255, 255,255,255,255, 255,255,0,0,0,0,0])

給定我的索引[nz,:nz:nz + 5] = 255。我認爲這意味着從當前索引nz到nz + 5的設置值爲255.

我的目標是避免必須進行for-loop爲了效率的原因迭代數組。我對python和numpy比較陌生,所以我們歡迎所有的建議。

+2

您可以使用示例輸入和預期輸出來編輯您的問題嗎? – Korem 2014-10-22 08:48:33

+0

這是一個索引錯誤,只是在一些較舊的numpy版本中存在一個錯誤,它完全被允許。你有一個維度的兩個指標。 – seberg 2014-10-22 17:11:27

回答

0

如何創建切片的矩陣:

>>> import numpy as np 
>>> r = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 
>>> nz = np.nonzero(r) 
>>> slices = np.vstack(np.arange(x, x + 5) for x in nz[0]) 
>>> slices 
array([[ 2, 3, 4, 5, 6], 
     [ 3, 4, 5, 6, 7], 
     [ 5, 6, 7, 8, 9], 
     [ 8, 9, 10, 11, 12], 
     [10, 11, 12, 13, 14]], dtype=int64) 
>>> r[slices] 
array([[1, 1, 0, 1, 0], 
     [1, 0, 1, 0, 0], 
     [1, 0, 0, 1, 0], 
     [1, 0, 1, 0, 0], 
     [1, 0, 0, 0, 0]]) 
>>> r[slices] = 255 
>>> r 
array([ 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
     255, 255, 0, 0, 0, 0, 0]) 

請注意,此代碼假定你有足夠的「填充」結尾。如果它嘗試索引r以外的項目,它將失敗,並顯示IndexError

0

問題描述類似於典型的信號卷積步驟。 scipy中有兩個模塊實現信號處理,scipy.signalscipy.ndimage,如果您打算做更多的事情,您可能會感興趣。在這種特殊情況下,可以使用通用np.convolve(請注意,我添加用於說明目的尾隨1):

In [45]: r = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1]) 

In [46]: r[np.convolve(r, np.ones(5, dtype=r.dtype))[:-4] > 0] = 255; r 
Out[46]: 
array([ 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
     255, 255, 0, 0, 0, 0, 255]) 

這裏的卷積運算的結果:

In [48]: np.convolve(r, np.ones(5, dtype=r.dtype)) 
Out[48]: 
array([0, 0, 1, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]) 

正如你所看到的,最後的1最後產生了完整的1,它們應該被剝離。之後,卷積陣列中的非零元素將爲您提供所需的布爾掩碼:

In [49]: np.convolve(r, np.ones(5, dtype=r.dtype))[:-4] > 0 
Out[49]: 
array([False, False, True, True, True, True, True, True, True, 
     True, True, True, True, True, True, False, False, False, 
     False, True], dtype=bool)