NumPy是Python做數(shù)據(jù)處理的底層庫(kù),是高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ),比如著名的Python機(jī)器學(xué)習(xí)庫(kù)SKlearn就需要NumPy的支持。掌握NumPy的基礎(chǔ)數(shù)據(jù)處理能力是利用Python做數(shù)據(jù)運(yùn)算及機(jī)器學(xué)習(xí)的基礎(chǔ)。
- NumPy(或簡(jiǎn)稱NP)的主要功能特性如下:
- 具有數(shù)組(ndarray)能力,這是一個(gè)具有矢量算術(shù)運(yùn)算和復(fù)雜廣播的快速且節(jié)省空間的多維數(shù)組。
- 用于對(duì)整租數(shù)據(jù)進(jìn)行快速運(yùn)算的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)(代替循環(huán)實(shí)現(xiàn))。
- 可用于讀寫數(shù)據(jù)以及操作內(nèi)存映射文件。
- 具有線性代數(shù)、隨機(jī)數(shù)生成以及傅里葉交換功能。
- 可集成C、C++、Fortran等語(yǔ)言,提供了簡(jiǎn)單易用的C API,很容易將數(shù)據(jù)傳遞給低級(jí)語(yǔ)言編寫的外部庫(kù),也能以NumPy數(shù)組的形式將數(shù)據(jù)返回給Python。
NumPy本身沒(méi)有多么高級(jí)的數(shù)據(jù)分析能力,但理解NumPy數(shù)組以及面向數(shù)組的操作會(huì)有利于理解之后講到的Pandas(Python的另一個(gè)數(shù)據(jù)分析庫(kù)),也有助于自己利用Python編寫機(jī)器學(xué)習(xí)或深度學(xué)習(xí)算法,甚至也是日后應(yīng)用Sklearn的基礎(chǔ)。
對(duì)于NumPy而言,它的實(shí)際應(yīng)用會(huì)側(cè)重于以下幾點(diǎn):
- 數(shù)據(jù)讀取或生成,盡管它本身這方面的能力不強(qiáng),但偶爾也可以使用。
- 數(shù)據(jù)合并、清洗、過(guò)濾、轉(zhuǎn)換等數(shù)組操作。
- 常用的數(shù)組算法應(yīng)用,例如排序、唯一化、集合運(yùn)算等。
- 數(shù)據(jù)描述性統(tǒng)計(jì)以及數(shù)據(jù)聚合或摘要運(yùn)算。
- 用于易購(gòu)數(shù)據(jù)的合并、連接運(yùn)算的數(shù)據(jù)對(duì)齊和關(guān)系型數(shù)據(jù)運(yùn)算。
- 利用數(shù)組表達(dá)式代替條件邏輯表達(dá)式(if-else)。
NumPy基礎(chǔ)
NumPy操作的對(duì)象是N維數(shù)組,稱為ndarray,大多數(shù)情況下都叫做數(shù)組。我們先來(lái)看一個(gè)N維數(shù)組:
- >>> import NumPy as np
- >>> data = np.arange(15).reshape(3, 5)
- >>> print (data)
- [[ 0, 1, 2, 3, 4],
- [ 5, 6, 7, 8, 9],
- [10, 11, 12, 13, 14]]
先忽略上面的代碼語(yǔ)法,我們只看data,它就是一個(gè)3行5列的數(shù)組對(duì)象。既然是對(duì)象,一定有屬性,NumPy中數(shù)組的屬性常用屬性如下:
ndarray.ndim。數(shù)組軸的個(gè)數(shù),在python的世界中,軸的個(gè)數(shù)被稱作秩。如上面我們構(gòu)建的數(shù)組data的軸的個(gè)數(shù)為2。軸的概念和平面圖形里面的X軸、Y軸是一個(gè)概念,2個(gè)軸代表該數(shù)組是二維數(shù)據(jù)。
ndarray.shape。數(shù)組的矩陣形狀。這是一個(gè)指示數(shù)組在每個(gè)維度上大小的整數(shù)元組。如上面的data數(shù)組,每個(gè)軸的矩陣形狀都是3行5列。
- >>> print (data.shape)
- (3, 5)
ndarray.size。數(shù)組元素的總個(gè)數(shù),等于shape屬性中元組元素的乘積。如上面的data數(shù)組中元素的總個(gè)數(shù)為15。
ndarray.dtype。一個(gè)用來(lái)描述數(shù)組中元素類型的對(duì)象,可以通過(guò)創(chuàng)造或指定dtype使用標(biāo)準(zhǔn)Python類型。另外NumPy提供它自己的數(shù)據(jù)類型。如上面的data數(shù)組的對(duì)象類型為int32.
- >>> print (data.dtype)
- int32
除此以外,數(shù)組ndarray還有其他屬性,例如用于表示每個(gè)元素字節(jié)數(shù)的itemsize,白哦是實(shí)際數(shù)組緩沖區(qū)的data屬性等,但這些都應(yīng)用不多。
NumPy的數(shù)據(jù)類型。不要為了記憶NumPy的dtypes而煩惱,尤其當(dāng)你是一個(gè)新用戶。通常只需要關(guān)心普通的數(shù)據(jù)類型即可(浮點(diǎn)、復(fù)數(shù)、整形、布爾型、字符串)。 當(dāng)你需要更多的控制數(shù)據(jù)如何存儲(chǔ)到內(nèi)存和磁盤,特別是大的數(shù)據(jù)集時(shí),知道你所控制的存儲(chǔ)類型是很有必要的。
ndarray的數(shù)據(jù)類型語(yǔ)法為:
- #指定數(shù)組類型為int16
- >>> int16_arr = np.array( [1, 2, 3], dtype = np.int16)
- >>> print int16_arr
- [1, 2, 3]
- #指定數(shù)組類型為float64
- >>> float64_arr = np.array( [1, 2, 3], dtype = np.float64)
- >>> print float64_arr
- [ 1. , 2. , 3. ]
完整的ndarray類型列表如下:
類型 |
類型碼 |
描述 |
int8, uint8 |
i1, u1 |
有符號(hào)和無(wú)符號(hào)8位(1字節(jié))整數(shù)類型 |
int16, uint16 |
i2, u2 |
有符號(hào)和無(wú)符號(hào)16位整數(shù)類型 |
int32, uint32 |
i4, u4 |
有符號(hào)和無(wú)符號(hào)32位整數(shù)類型 |
int64, uint64 |
i8, u8 |
有符號(hào)和無(wú)符號(hào)64位整數(shù)類型 |
float16 |
f2 |
半精度浮點(diǎn)類型 |
float32 |
f4 or f |
標(biāo)準(zhǔn)精度浮點(diǎn)。與C的 float 兼容 |
float64, float128 |
f8 or d |
標(biāo)準(zhǔn)雙精度浮點(diǎn)。與C的 double 和Python 的 folat 對(duì)象兼容 |
float128 |
f16 or g |
擴(kuò)展精度浮點(diǎn) |
complex64, complex128, complex256 |
c8, c16, c32 |
分別使用兩個(gè)32,64,128位浮點(diǎn)表示的復(fù)數(shù) |
bool |
? |
布爾值,存儲(chǔ) True 和 False |
object |
O |
Python對(duì)象類型 |
string_ |
S |
定長(zhǎng)字符竄類型(每字符一字節(jié))。例如,為了生成長(zhǎng)度為10的字符竄,使用 ‘S10’ |
unicode_ |
f16 or g |
擴(kuò)展精度浮點(diǎn)(字節(jié)書依賴平臺(tái))。同 string_ 有相同的語(yǔ)義規(guī)范(例如:U10 ) |
導(dǎo)入NumPy庫(kù)
首先確保你已經(jīng)安裝了NumPy,如果尚未安裝請(qǐng)參考 NumPy下載安裝指南。導(dǎo)入NumPy到Python中。
- >>> import NumPy as np
- >>> from NumPy import *
這兩種方式都可以導(dǎo)入NumPy到python中使用,建議讀者使用第一種以養(yǎng)成良好的代碼習(xí)慣。本文默認(rèn)的都以第一種作為引用規(guī)則。
創(chuàng)建NumPy數(shù)組
創(chuàng)建NumPy數(shù)組有幾種形式。
第一種,假如已經(jīng)有了數(shù)組表達(dá)式或值,這通常來(lái)源于前期數(shù)據(jù)導(dǎo)入代碼或者其他庫(kù),在這里只需要將其轉(zhuǎn)換成NumPy數(shù)組即可。如下列代碼,a為列表,通過(guò)np.array()將其轉(zhuǎn)換為NumPy的ndarray類型。
- >>> a = [[1,2,3],[4,5,6]
- >>> a2 = np.array(a)
- >>> print (type(a2))
- NumPy.ndarray
注意:
- array函數(shù)支持Python創(chuàng)建的列表和元素。
- array()內(nèi)的值一定是元素或列表,而不能是其他值。
- array()轉(zhuǎn)換后的對(duì)象類型會(huì)根據(jù)默認(rèn)為實(shí)際可用值,也可手動(dòng)指定。
當(dāng)然,很多場(chǎng)景下被轉(zhuǎn)換的變量可能不是上述“現(xiàn)成” 的矩陣,這時(shí)候需要我們“手動(dòng)”進(jìn)行轉(zhuǎn)換。如下列代碼,原始被轉(zhuǎn)換的變量是一個(gè)1行15列的數(shù)組,這時(shí)候我們需要根據(jù)實(shí)際需求將其轉(zhuǎn)換為3行5列的數(shù)組,通過(guò)reshape函數(shù)即可實(shí)現(xiàn)。
- >>> import NumPy as np
- >>> a3 = np.arange(15).reshape(3, 5)
- >>> print a3
- [[ 0, 1, 2, 3, 4],
- [ 5, 6, 7, 8, 9],
- [10, 11, 12, 13, 14]]
第二種,某些時(shí)候數(shù)組里面的值可能是未知的,但矩陣的大小其實(shí)是已經(jīng)確定的,比如我們了解到接下來(lái)的運(yùn)算中需要一個(gè)3行4列的矩陣,那么就可以利用NumPy創(chuàng)建矩陣。當(dāng)然,矩陣的值可能為空,也可以是某些特定值,這取決于創(chuàng)建的方法。
方法一:使用zeros創(chuàng)建全為0的矩陣。如下代碼創(chuàng)建了一個(gè)3行4列且值全為0的二維矩陣。
- >>> a4 = np.zeros((3,4))
- >>> print a4
- [[0., 0., 0., 0.],
- [0., 0., 0., 0.],
- [0., 0., 0., 0.]]
方法二:使用ones創(chuàng)建全為1的矩陣。如下代碼創(chuàng)建了一個(gè)三維,每個(gè)維都是3行4列的矩陣。
- >>> a5 = np.ones((3,4))
- >>> print a5
- [[[ 1, 1, 1, 1],
- [ 1, 1, 1, 1],
- [ 1, 1, 1, 1]],
- [[ 1, 1, 1, 1],
- [ 1, 1, 1, 1],
- [ 1, 1, 1, 1]]]
方法三:使用empty創(chuàng)建一個(gè)內(nèi)容隨機(jī)并且依賴與內(nèi)存狀態(tài)的數(shù)組。如下代碼創(chuàng)建了一個(gè)2行3列的矩陣,但值為隨機(jī)產(chǎn)生。這種創(chuàng)建方法一般很少使用。
- >>> a6 = np.ones((2,3))
- >>> print a6
- [[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
- [ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]]
默認(rèn)情況下,創(chuàng)建的矩陣對(duì)象類型是float64,也可以通過(guò)dtype創(chuàng)建時(shí)指定對(duì)象類型。
方法四:使用arange或者linspace創(chuàng)建一個(gè)新的數(shù)值序列數(shù)組。
- #使用arange創(chuàng)建從10到30,步長(zhǎng)為5的數(shù)值序列,其中開(kāi)始數(shù)值10以及步長(zhǎng)5都是可選設(shè)置
- >>> a7 = np.arange( 10, 30, 5 )
- >>> print a7
- [10, 15, 20, 25]
- #使用linspace創(chuàng)建從0到2,一共9個(gè)數(shù)值的序列
- >>> a8 = np.linspace( 0, 2, 9 )
- >>> print a8
- [ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ]
arange函數(shù)和linspace都可以創(chuàng)建固定起止數(shù)值的數(shù)組,但二者的區(qū)別在于arange通過(guò)控制步長(zhǎng)確定數(shù)組個(gè)數(shù),而linspace直接設(shè)置個(gè)數(shù)(而自動(dòng)設(shè)置步長(zhǎng))。
以上時(shí)常用創(chuàng)建數(shù)組的方法,更多細(xì)節(jié)函數(shù)請(qǐng)見(jiàn):array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, rand, randn, fromfunction, fromfile
簡(jiǎn)單的NumPy數(shù)組運(yùn)算
數(shù)組間簡(jiǎn)單運(yùn)算
- >>> arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
- >>> arr2 = np.array([[2., 3., 4.], [5., 6., 7.]])
- #數(shù)組加法
- >>> print arr1 + arr2
- [[3, 5, 7],
- [9, 11, 13]]
- #數(shù)組減法
- >>> print arr1 – arr2
- [[-1, -1, -1],
- [-1, -1, -1]]
- #數(shù)組乘法
- >>> print arr1 * arr2
- [[2, 6, 12],
- [20, 30, 42]]
- #數(shù)組除法
- >>> print arr1 / arr2
- [[0.5, 0.6667, 0.75],
- [0.8, 0.8333, 0.8571]]
數(shù)組與數(shù)值運(yùn)算
數(shù)組與數(shù)值運(yùn)算的基本方法與數(shù)組間運(yùn)算語(yǔ)法相同,在此只舉一個(gè)例子,其余參加數(shù)組間語(yǔ)法。
- >>> arr1 = np.array([[1., 2., 3.], [4., 5., 6.]])
- #數(shù)組與數(shù)值加法
- >>> print (arr1 + 2)
- [[3 , 4, 5],
- [6 , 7, 8]]
- #數(shù)組與數(shù)值減法
- >>> print (arr1 – 2)
- [[-1, 0, 1],
- [2, 3, 4]]
- #數(shù)組與數(shù)值乘法
- >>> print (arr1 * 2)
- [[2, 4, 6],
- [8, 10, 12]]
- #數(shù)組與數(shù)值除法
- >>> print (arr1 / 2)
- [[0.5, 1, 1.5],
- [2, 2.5, 3]
注意:數(shù)組與數(shù)值間的運(yùn)算不僅可以有整數(shù),小數(shù)也可以有。那么問(wèn)題來(lái)了,如果是arr1 * 0.5結(jié)果會(huì)是什么呢?會(huì)有什么規(guī)律?這個(gè)交給大家來(lái)發(fā)掘吧。(提示:將結(jié)果對(duì)照上述的四則運(yùn)算)
數(shù)組函數(shù)運(yùn)算
通用函數(shù)( 又稱ufunc)是一個(gè)在ndarrays的數(shù)據(jù)上進(jìn)行基于元素的操作的函數(shù)。NumPy提供常見(jiàn)的數(shù)學(xué)函數(shù)如sin、cos和exp,也提供簡(jiǎn)單的統(tǒng)計(jì)函數(shù)如mean, std, vary等。實(shí)際上,之前我們已經(jīng)在使用一些通用函數(shù)了,例如生成有序序列的arange、生成全為1的zeros函數(shù)等。 這部分重點(diǎn)介紹的是NumnPy的常用來(lái)做計(jì)算的函數(shù)。
- >>> arr = np.arange(4)
- >>> print arr
- [0, 1, 2, 3]
- #求arr的絕對(duì)值
- >>> print np.abs(arr)
- [0, 1, 2, 3]
- #求arr的平方根
- >>> print np.sqrt(arr)
- [0, 1, 1.414, 1.732]
- #求arr的平方
- >>> print np.square(arr)
- [0, 1, 4, 9]
- #求arr的指數(shù)
- >>> print np.exp(arr)
- [1, 2.728, 7.389, 20.086]
- #求arr以e為底的對(duì)數(shù)
- >>> print np.log(arr)
- [-inf, 0, 0.693, 1.099]
- #求arr每個(gè)元素的正負(fù)號(hào)
- >>> print np.sign(arr)
- [0, 1, 1, 1]
- #求arr每個(gè)元素的cos值
- >>> print np.cos(arr)
- [1, 0.540, -0.416, -0.990]
以下提供了相對(duì)完整的常用數(shù)組運(yùn)算函數(shù)的列表。更多細(xì)節(jié),請(qǐng)?jiān)L問(wèn)NumPy Example List了解更多信息。
函數(shù) |
描述 |
abs, fabs |
計(jì)算基于元素的整形,浮點(diǎn)或復(fù)數(shù)的絕對(duì)值。fabs對(duì)于沒(méi)有復(fù)數(shù)數(shù)據(jù)的快速版本 |
sqrt |
計(jì)算每個(gè)元素的平方根。等價(jià)于 arr ** 0.5 |
square |
計(jì)算每個(gè)元素的平方。等價(jià)于 arr ** 2 |
exp |
計(jì)算每個(gè)元素的指數(shù)。 |
log, log10, log2, log1p |
自然對(duì)數(shù)(基于e),基于10的對(duì)數(shù),基于2的對(duì)數(shù)和 log(1 + x) |
sign |
計(jì)算每個(gè)元素的符號(hào):1(positive),0(zero), -1(negative) |
ceil |
計(jì)算每個(gè)元素的天花板,即大于或等于每個(gè)元素的最小值 |
floor |
計(jì)算每個(gè)元素的地板,即小于或等于每個(gè)元素的最大值 |
rint |
圓整每個(gè)元素到最近的整數(shù),保留dtype |
modf |
分別返回分?jǐn)?shù)和整數(shù)部分的數(shù)組 |
isnan |
返回布爾數(shù)組標(biāo)識(shí)哪些元素是 NaN (不是一個(gè)數(shù)) |
isfinite, isinf |
分別返回布爾數(shù)組標(biāo)識(shí)哪些元素是有限的(non-inf, non-NaN)或無(wú)限的 |
cos, cosh, sin sinh, tan, tanh |
regular 和 hyperbolic 三角函數(shù) |
arccos, arccosh, arcsin, arcsinh, arctan, arctanh |
反三角函數(shù) |
logical_not |
計(jì)算基于元素的非x的真值。等價(jià)于 -arr |
數(shù)組統(tǒng)計(jì)運(yùn)算
數(shù)據(jù)統(tǒng)計(jì)是Python做數(shù)據(jù)分析的重要步驟,NumPy提供了常用的求和、均值、方差、標(biāo)準(zhǔn)差、最大最小值、累積等函數(shù)。以下以sum求和函數(shù)為例解釋使用方法,其余函數(shù)用法類似。
- >>> arr = np.arange(6).reshape(2,3)
- >>> print arr
- [[0, 1, 2],
- [3, 4, 5]]
- #求arr的全部(行和列)的總和
- >>> print np.sum(arr)
- 15
- #大多數(shù)情況下,我們會(huì)指定求某列或某行的和
- #求基于列的和
- >>> print np.sum(arr, axis = 1)
- [3, 12]
- #求基于行的和
- >>> print np.sum(arr, axis = 0)
- [3, 5, 7]
以下列表是常用的NumPy的統(tǒng)計(jì)函數(shù)。更多細(xì)節(jié),請(qǐng)?jiān)L問(wèn)NumPy Example List了解更多信息。
sum |
對(duì)數(shù)組的所有或一個(gè)軸向上的元素求和。零長(zhǎng)度的數(shù)組的和為靈。 |
mean |
算術(shù)平均值。靈長(zhǎng)度的數(shù)組的均值為NaN。 |
std, var |
標(biāo)準(zhǔn)差和方差,有可選的調(diào)整自由度(默認(rèn)值為n)。 |
min, max |
最大值和最小值 |
argmin, argmax |
索引最小和最大元素。 |
cumsum |
從0元素開(kāi)始的累計(jì)和。 |
cumprod |
從1元素開(kāi)始的累計(jì)乘。 |
注意:本部分是使用Python做機(jī)器學(xué)習(xí)等場(chǎng)景下經(jīng)常使用的函數(shù),每個(gè)函數(shù)的用法都需要牢記。
NumPy數(shù)組預(yù)處理
數(shù)據(jù)預(yù)處理是在進(jìn)行數(shù)據(jù)挖掘、探索、學(xué)習(xí)之前的必要步驟,NumPy提供了較多的數(shù)據(jù)預(yù)處理功能。例如轉(zhuǎn)置、索引、切片、數(shù)組間函數(shù)處理、邏輯條件表達(dá)式、排序、集合等。
NumPy數(shù)組轉(zhuǎn)置
數(shù)組轉(zhuǎn)置是將數(shù)據(jù)進(jìn)行矩陣“對(duì)換”的一種方式,NunPy提供了transpose函數(shù)和.T屬性兩種是實(shí)現(xiàn)形式。
- #一維數(shù)組轉(zhuǎn)置
- >>> arr = np.arange(6)
- >>> print arr
- [0, 1, 2, 3, 4, 5]
- >>> print np.transpose(arr)
- [0, 1, 2, 3, 4, 5]#一維還是一維…
- #二維數(shù)組轉(zhuǎn)置
- >>> arr = np.arange(6).reshape((2,3))
- >>> print arr
- [[0, 1, 2],
- [3, 4, 5]]
- >>> print np.transpose(arr)
- [[0,3],
- [1,4],
- [3,5]]
- #三維數(shù)組的轉(zhuǎn)置
- >>> arr = np.arange(24).reshape((2,3,4))
- >>> print arr
- [[[ 0, 1, 2, 3],
- [ 4, 5, 6, 7],
- [ 8, 9, 10, 11]],
- [[ 12, 13, 14, 15],
- [ 16, 17, 18, 19],
- [ 20, 21, 22, 23]]]
- >>> print np.transpose(arr)
- [[[0, 12],
- [4, 16],
- [8, 20]],
- [[1, 13],
- [5, 17],
- [9, 21]],
- [[2, 14],
- [6, 18],
- [10, 22]],
- [[3, 15],
- [7, 19],
- [11, 23]]]
- #當(dāng)數(shù)組>=三維之后,我們可能希望按照特定規(guī)則來(lái)轉(zhuǎn)置,transpose 可以接受用于指定轉(zhuǎn)置的坐標(biāo)軸號(hào)碼的元組
- >>> print np.transpose(arr, (1,0,2))
- [[[ 0, 1, 2, 3],
- [ 12, 13, 14, 15]],
- [[ 4, 5, 6, 7],
- [ 16, 17, 18, 19]],
- [[ 8, 9, 10, 11],
- [ 20, 21, 22, 23]]]
對(duì)于是否指定轉(zhuǎn)化規(guī)則,具體來(lái)看三維的變化:原始數(shù)據(jù)的“三維”是(2,3,4),不指定轉(zhuǎn)換規(guī)則后的“三維”是(4,3,2),而指定規(guī)則后的三維則是按照我們指定的規(guī)則,將其一維和二維進(jìn)行調(diào)換。
- #原始三維數(shù)據(jù)規(guī)則
- >>> print (arr.shape)
- (2, 3, 4)
- #不指定轉(zhuǎn)換規(guī)則
- >>> print (np.transpose(arr).shape)
- (4, 3, 2)
- #指定轉(zhuǎn)換規(guī)則
- >>> print (np.transpose(arr,(1, 0, 2)).shape)
- (3, 2, 4)
ndarray的T屬性,用法則比較簡(jiǎn)單,只需要在數(shù)組后跟.T即可。.T屬性實(shí)際是轉(zhuǎn)置里面的特殊情況,即不指定轉(zhuǎn)置規(guī)則的默認(rèn)規(guī)則。
- #一維數(shù)組轉(zhuǎn)置
- >>> arr = np.arange(6)
- >>> print arr
- [0, 1, 2, 3, 4, 5]
- >>> print arr.T
- [0, 1, 2, 3, 4, 5]#一維還是一維…
- #二維數(shù)組轉(zhuǎn)置
- >>> arr = np.arange(6).reshape((2,3))
- >>> print arr
- [[0, 1, 2],
- [3, 4, 5]]
- >>> print arr.T
- [[0,3],
- [1,4],
- [3,5]]
- #三維數(shù)組的轉(zhuǎn)置
- >>> arr = np.arange(24).reshape((2,3,4))
- >>> print arr
- [[[ 0, 1, 2, 3],
- [ 4, 5, 6, 7],
- [ 8, 9, 10, 11]],
- [[ 12, 13, 14, 15],
- [ 16, 17, 18, 19],
- [ 20, 21, 22, 23]]]
- >>> print arr.T
- [[[0, 12],
- [4, 16],
- [8, 20]],
- [[1, 13],
- [5, 17],
- [9, 21]],
- [[2, 14],
- [6, 18],
- [10, 22]],
- [[3, 15],
- [7, 19],
- [11, 23]]]
當(dāng)某些情況下,你可能只需要轉(zhuǎn)換其中的兩個(gè)軸,除了可以使用transpose指定軸以外(當(dāng)然需要每個(gè)軸都指定順便,只是調(diào)整其中的部分而已),還可以使用swapreaxes。
- >>> arr = np.arange(24).reshape((2,3,4))
- >>> print arr
- [[[ 0, 1, 2, 3],
- [ 4, 5, 6, 7],
- [ 8, 9, 10, 11]],
- [[ 12, 13, 14, 15],
- [ 16, 17, 18, 19],
- [ 20, 21, 22, 23]]]
- >>> print arr.swapaxes(1, 0)
- [[[ 0, 1, 2, 3],
- [ 12, 13, 14, 15]],
- [[ 4, 5, 6, 7],
- [ 16, 17, 18, 19]],
- [[ 8, 9, 10, 11],
- [ 20, 21,
|