標籤:

Python-NumPy模塊的轉置軸對換(2)

1.前言

轉置(transpose)是重塑的一種特殊形式。他返回的是源數組的視圖,也就是說源數組與對源數組轉置後返回的數組指向的是同一個地址。numpy中的轉置有三種方式:

  1. T屬性
  2. transpose方法
  3. swapaxes方法

import numpy as nparray = np.arange(12).reshape((3,4))array2 = array.Tprint("-----源數組-----")print(array)print(array2)print("-----修改後的數組-----")array2[0] = 10000print(array)print(array2)-----源數組-----[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]][[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]]-----修改後的數組-----[[10000 1 2 3] [10000 5 6 7] [10000 9 10 11]][[10000 10000 10000] [ 1 5 9] [ 2 6 10] [ 3 7 11]]

2.T屬性

T屬性使用還是很方便的,他比較適合應用在一維或者二維數組上,我們在處理矩陣的時候用到最多的就是T屬性了,但是這並不意味著他不能應用於高維數組。

import numpy as nparray = np.array([1,2,3,4])print(array)print(array.T)[1 2 3 4][1 2 3 4]

這裡需要注意的:

  1. 我們不能把一維數組或者前面所說調用shape方法返回形狀的元組是"( 元素個數 , )"這種元組看成是可以進行轉置的一維數組,其實對他轉置並沒有什麼效果,這是因為這裡的所說的一維數組是shape方法返回(行數,1)或者(1,列數)這樣的形狀的數組,其實我們可以把前面的"(元素個數,)"這種形狀的看成是一個沒有完整維度的一維數組。

我這裡有三種方式去改變一維數組,使其成為完整維度的一維數組:

import numpy as nparray = np.array([1,2,3,4])print("-----方式一-----")A = array.reshape(1,array.shape[0])print(A)print(A.shape)print("-----方式二-----")B = array[:,np.newaxis]print(B)print(B.shape)print("-----方式三-----")array.shape = (4,1)print(array)print(array.shape) -----方式一-----[[1 2 3 4]](1, 4)-----方式二-----[[1] [2] [3] [4]](4, 1)-----方式三-----[[1] [2] [3] [4]](4, 1)

這裡要提下一個reshape函數:

import numpy as nparray = np.arange(12).reshape((3,4))array2 = array.reshape((3,4))print("-----源數據-----")print(array)print(array2)print("-----修改後的數據-----")array2[0] = 10000print(array)print(array2)-----源數據-----[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]][[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]-----修改後的數據-----[[10000 10000 10000 3] [ 4 5 6 7] [ 8 9 10 11]][[10000 10000 10000] [ 3 4 5] [ 6 7 8] [ 9 10 11]]

注意:

  1. 使用reshape函數,返回的是源數組的視圖。這裡所說的源數組的視圖說的就是如果我們修改其中一個數組,另一個源數組也會發生變化,他們操作的對象是同一個。

對於二維數組的T屬性就很容易了:

import numpy as nparray = np.arange(12).reshape((3,4))array2 = array.Tprint(array.shape)print(array2.shape)(3, 4)(4, 3)

對於T的屬性在高維數組上的處理,我是通過實驗結果然後看規律這樣方式來研究T屬性在高維度應用的,其實這個和後面要說的transpose方法差不太多,T屬性不能指定只能使用的默認轉置方式,而transpose方法是可以我們自己指定轉換的。

import numpy as nparray = np.arange(8).reshape((2,2,2))array2 = array.Tprint(array)print(array2)

輸出的結果

各元素對應的位置

那我們從上面的各元素對應位置的哪個圖表,可以很清楚的看出,使用T屬性對多維數組進行轉置,他會交換位置序列的第一個值和最後一個值。但是對於多維數組來說我們還是比較喜歡使用transpose,使用T屬性進行轉置一般用於對於一維數組或者二維數組(矩陣)。

3.transpose方法

對於transpose方法來說也是可以應用於一維、二維或者多維,但是上面我們也說了對於一維或者二維數組來說使用T屬性來進行轉置還是很方便的,但是如果對於多維數組來說,使用T屬性來進行轉置我們只能對第一位置和最後一個位置進行轉置,這樣做很是不夠方便,所以transpose方法能夠很好的幫助我們解決這個問題。當然在談論transpose多維上的應用前,我們還是要先給出在一維數組以及二維數組上的使用。

import numpy as nparray = np.array([1,2,3,4])A = array[np.newaxis,:]print("-----源數據-----")print(A)print(A.shape)print("-----轉置數據-----")A = A.transpose()print(A)print(A.shape)-----源數據-----[[1 2 3 4]](1, 4)-----轉置數據-----[[1] [2] [3] [4]](4, 1)

import numpy as nparray = np.arange(12).reshape((3,4))print("-----源數據-----")print(array)print(array.shape)print("-----轉置數據-----")array = array.transpose()print(array)print(array.shape)-----源數據-----[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]](3, 4)-----轉置數據-----[[ 0 4 8] [ 1 5 9] [ 2 6 10] [ 3 7 11]](4, 3)

那下面就開始討論多維數組的情況,對於高維數組來說,transpose需要用到一個由編號組成的元組,這樣才能進行轉置,其實我們上面對於T屬性的時候已經分析過了,他這裡說的編號也就是對應的形狀元組的位置,這樣說應該很抽象,我們拿實際三維數組為例來進行分析:

array = np.arange(8).reshape((2,2,2))

對應關係

那麼我們可以看下面的代碼:

import numpy as nparray = np.arange(8).reshape((2,2,2))print(array)print(array.transpose(0,1,2))

列印輸出結果

從上面我們可以看見輸出結果並沒有發生任何的改變,那我們在看一個例子:

import numpy as nparray = np.arange(8).reshape((2,2,2))print(array)print(array.transpose(2,1,0))

輸出結果

那其實我們可以看出和前面我們使用T屬性進行轉置的效果是一樣的,我想你一定看出了這其中的奧秘所在,我們默認的元組中的順序是(0,1,2),那我們調用transpose(元組序列),這裡我們傳入的參數是(2,1,0),我們對比一下會發現,我的第一個元素位置和最後一個元素的位置發生了改變,其實如果你看了我前面對T轉置對多維數組的分析的話你就會很輕鬆的搞懂這裡面的關係。

4.swapaxes方法

ndarray還有一個swapaxes方法,他需要接受一對軸編號。那我們先看一個有趣的東西:

import numpy as nparray = np.arange(8).reshape((2,2,2))print(array)print(array.swapaxes(0,2))

輸出結果

你一定會發現這是搞毛線,這三個都一樣呀,其實確實都一樣。但是這裡的swapaxes是以軸為單位的,並且只能傳入兩個軸參數,下面是二維數組的axis順序,其實很容易想像對於一個三維的數組他的軸還有一個axis 3其實也就是對應最後一個shape返回元組的最後一個位置。

對於三維數組來說,我的軸就是axis 0,axis 1,axis 2,其實我覺的這個軸就對應上面的那個對應關係,只不過上面的在元組中的序號變成了現在的軸。

對應關係


推薦閱讀:

ImagePy教程 —— 幾何變換
怎麼理解numpy的where()?
Python——numpy文件存取
給深度學習入門者的Python快速教程 - numpy和Matplotlib篇
Python C Extesion (pyd)

TAG:Python | numpy |