2012-01-31 68 views
4

m是具有形狀(12,21,21)一個ndarray,現在我想利用僅有一稀疏切片,以形成一個新的2D陣列,具有不解關於如何分割一個numpy的陣列

sliceid = 0 
indx = np.array([0, 2, 4, 6, 8, 10]) 

使sparse_slice是,直觀,

sparse_slice = m[sliceid, indx, indx] 

但顯然上述操作無法正常工作,目前我現在用的就是

sparse_slice = m[sliceid,indx,:][:, indx] 

爲什麼第一個「直覺」的方式不起作用?有沒有比我目前的解決方案更緊湊的方式?我以前所有的ndarray切片試驗是基於什麼,但直覺,也許我將切換到閱讀現在的一些嚴重的手動...

回答

5

更簡潔的方法是做new = m[0, :12:2, :12:2]。這就是numpy文檔所謂的「基本索引」,意思是用一個整數或切片對象(即0:12:2)切片。當您使用基本索引時,numpy返回原始數組的視圖。例如:

In [3]: a = np.zeros((2, 3, 4)) 

In [4]: b = a[0, 1, ::2] 

In [5]: b 
Out[5]: array([ 0., 0.]) 

In [6]: b[:] = 7 

In [7]: a 
Out[7]: 
array([[[ 0., 0., 0., 0.], 
     [ 7., 0., 7., 0.], 
     [ 0., 0., 0., 0.]], 

     [[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]]) 

以你「直觀」的方式,你正在做的是用另一個數組索引數組。當你用另一個數組索引一個numpy數組時,數組需要具有相同的大小(或者它們需要相互之間進行廣播,更多的則是在一秒之內)。在文檔中,這被稱爲花哨索引或高級索引。例如:

In [10]: a = np.arange(9).reshape(3,3) 

In [11]: a 
Out[11]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

In [12]: index = np.array([0,1,2]) 

In [13]: b = a[index, index] 

In [14]: b 
Out[14]: array([0, 4, 8]) 

你看,我得到一個[0,0],[1,1]和[2,2]而不是[0,0],一個[0,1] ...如果你想索引的「外部產品」與索引,你可以做到以下幾點。

In [22]: index1 = np.array([[0,0],[1,1]]) 

In [23]: index2 = np.array([[0,1],[0,1]]) 

In [24]: b = a[index1, index2] 

In [25]: b 
Out[25]: 
array([[0, 1], 
     [3, 4]]) 

有做以上,這樣的簡寫:

In [28]: index = np.array([0,1]) 

In [29]: index1, index2 = np.ix_(index, index) 

In [31]: index1 
Out[31]: 
array([[0], 
     [1]]) 

In [32]: index2 
Out[32]: array([[0, 1]]) 

In [33]: a[index1, index2] 
Out[33]: 
array([[0, 1], 
     [3, 4]]) 

In [34]: a[np.ix_(index, index)] 
Out[34]: 
array([[0, 1], 
     [3, 4]]) 

你會發現,index1(2, 1)index2(1, 2),不(2, 2)。這是因爲兩個陣列彼此相互轉播,您可以閱讀更多關於廣播here的信息。請記住,當你使用花哨的索引時,你會得到原始數據的副本而不是視圖。有時候這會更好(如果你想保持原始數據不變),有時它只需要更多的內存。更多關於索引here

+0

檢查切片的端點。你不應該得到第12,14,16等等。 – wim 2012-01-31 05:05:46

+0

@wim,謝謝你。 – 2012-01-31 06:23:15

2

如果我沒有記錯,輸入m = np.array(range(5292)).reshape(12,21,21)你期待的

array([[ 0, 2, 4, 6, 8, 10], 
     [ 42, 44, 46, 48, 50, 52], 
     [ 84, 86, 88, 90, 92, 94], 
     [126, 128, 130, 132, 134, 136], 
     [168, 170, 172, 174, 176, 178], 
     [210, 212, 214, 216, 218, 220]]) 
輸出 sparse_slice = m[sliceid,indx,:][:, indx]

在這種情況下,你可以得到它使用一個切片的step部分:

m[0, :12:2, :12:2]