更簡潔的方法是做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。
檢查切片的端點。你不應該得到第12,14,16等等。 – wim 2012-01-31 05:05:46
@wim,謝謝你。 – 2012-01-31 06:23:15