數組切分
上面講了使用棧操作把多個數組組裝到一起的方法。接下來看一下它的逆操作:把一個數組分為及部分。在NumPy中,該操作要用到切分方法。同理,我們也有一組函數,水平切分用hsplit( )函數,垂直切分用vsplit( )函數。
水平切分數組的意思是把數組按照寬度切分成兩部分,例如4x4矩陣將被切分為兩個4x2的矩陣。
反之,垂直切分指的是將數組按照高度分為兩部分,如4x4矩陣將被切分為兩個2x4矩陣。
split( )函數更為複雜,可以把數組分為幾個不對稱的分布。此外,除了傳入數組作為參數外,還得指定被切分部分的索引。如果指定axis=1項,索引為列索引;如果axis=0,索引為行索引。
例如,要把矩陣切分為三部分,第一部分為第一列,第二部分為第二列、第三列,而第三部分為最後一列。你需要像下面這樣指定索引值。
你也可以按行切分,方法相同。
基本概念
我們將介紹NumPy庫中的幾個常用概念。我們會講解副本和視圖的區別,其中著重講解兩者返回值的不同點。我們還會介紹NumPy函數的很多事務隱式使用的廣播機制。
對象的副本或視圖
你可能已經注意到了,NumPy中,尤其是在做數組運算或數組操作時,返回結果不是數組的副本就是視圖。NumPy中,所有賦值運算不會為數組和數組中的任何元素創建副本。
把數組a賦給數組b,實際上不是為a創建副本,b只不過是調用數組a的另一種方式。事實上,修改a的第三個元素,同樣也會修改b的第三個元素。數組的切片操作返回的對象只是原數組的視圖.
如上所見,即使是切片操作得到的結果,實際上仍指向相同的對象。如果想為原數組生成一份完整的副本,從而得到一個不同的數組,使用copy( )函數即可。
上面的例子中,即使改動數組a的元素,數組c仍保持不變。
向量化
向量化和廣播這兩個概念是NumPy內部實現的基礎。有了向量化,編寫代碼時無需使用顯式循環。這些循環實際上不能省略,只不過是在內部實現,被代碼中的其他結構代替。向量化的應用使得代碼更加簡潔,可讀性更強,你可以說使用了向量化方法的代碼看上去更「pythonic」。向量化使得很多運算看上去更像數學表達式,例如,NumPy中兩個數組相乘可以表示為a*b;甚至兩個矩陣相乘也可以表示為:A*B;而其他的語言則需要使用for循環結構。比如我們的c++語言結構就需要使用雙層的for循環,才能夠計算出數組的值:
由此可見,使用NumPy時,代碼的可讀性更強,其表達式更像是數學表達式。