numpy是一個開源python擴充程序庫,提供了高性能數(shù)組與矩陣運算處理能力。
一、ndarray多維數(shù)組
1. 創(chuàng)建ndarray數(shù)組
import numpy as np
data1=[5,7,9,20] #列表
data2=(5,7,9,20) #元組
data3=[[1,2,3,4],[5,6,7,8]] #多維數(shù)組
arr1=np.array(data1)
arr2=np.array(data2)
arr3=np.array(data3)
arr1
arr2
arr3
array([5, 7, 9, 20])
array([5, 7, 9, 20])
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
1.1 zeros函數(shù)
zeros函數(shù)可以創(chuàng)建指定長度或形狀的全0數(shù)組。
np.zeros(6)
Out[ ]: array([0., 0., 0., 0., 0., 0.])
np.zeros((3,4))
Out[ ]: array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
np.zeros_like(arr3)
Out[ ]: array([[0, 0, 0, 0],
[0, 0, 0, 0]])
1.2 ones函數(shù)
ones函數(shù)可以創(chuàng)建指定長度或形狀的全1數(shù)組。
np.ones(6)
Out[ ]: array([1., 1., 1., 1., 1., 1.])
np.ones((3,4))
Out[ ]: array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
np.ones_like(arr3)
Out[ ]: array([[1, 1, 1, 1],
[1, 1, 1, 1]])
1.3 empty函數(shù)
empty函數(shù)可以創(chuàng)建一個沒有具體值的數(shù)組。
np.empty((2,2,2))
Out[ ]: array([[[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 0.00000000e+000]],
[[0.00000000e+000, 6.99596955e-321],
[8.70018274e-313, 8.90060779e-307]]])
1.4 arange函數(shù)
arange函數(shù)主要用于創(chuàng)建數(shù)組。
np.arange(6)
Out[ ]: array([0, 1, 2, 3, 4, 5])
1.5 隨機函數(shù)
- randint生成整數(shù)隨機數(shù)。
import numpy as np
arr=np.random.randint(100,200,size=(3,4))
arr
Out[ ]: array([[135, 107, 119, 119],
[138, 105, 122, 120],
[186, 193, 144, 151]])
- randn函數(shù),生成平均數(shù)為0,標準差為1的正態(tài)分布的隨機數(shù)。
import numpy as np
arr=np.random.randn(2,3,2)
arr
Out[ ]: array([[[ 1.78521479, -0.41762213],
[-1.71612921, -1.01758876],
[-0.25929651, -0.43067282]],
[[ 1.14328724, -1.13676288],
[ 2.05677322, 2.03150197],
[-0.39033181, -0.93722018]]])
2. ndarray屬性
arr3.shape
Out[ ]: (2, 4)
arr3.dtype
Out[ ]: dtpye('int32')
2.1 ndarray數(shù)據(jù)類型
數(shù)組常見的數(shù)據(jù)類型有以下幾種:浮點數(shù)(float)、整數(shù)(int)、復(fù)數(shù)(complex)、布爾值(bool)、字符串(string_和Python對象(object)
arr4=arr1.astype('float64')
arr4
Out[ ]: array([ 5., 7., 9., 20.])
如果將浮點數(shù)轉(zhuǎn)換為整數(shù),并不會使用四舍五入的方式來轉(zhuǎn)換,而是元素的小數(shù)部分都會被截斷。
3. 數(shù)組變換
3.1 數(shù)組重塑
np.arange(9).reshape((3,3))
Out[ ]: array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
reshape的參數(shù)中的一維參數(shù)可以設(shè)置為-1,表示數(shù)組的維度可以通過數(shù)據(jù)本身來推斷。
arr=np.arange(12).reshape((3,-1))
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
與reshape相反的是數(shù)據(jù)散開(ravel)或扁平化(flatten)。
arr.ravel()
Out[ ]: array([0, 1, 2, 3, 4, 5, 6, 7, 8])
3.2 數(shù)組合并
np.concatenate([arr3,arr3],axis=0)
Out[ ]: array([[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 2, 3, 4],
[5, 6, 7, 8]])
np.concatenate([arr3,arr3],axis=1)
array([[1, 2, 3, 4, 1, 2, 3, 4],
[5, 6, 7, 8, 5, 6, 7, 8]])
3.3 數(shù)組拆分
數(shù)組拆分是數(shù)組合并的相反操作,通過split可以將數(shù)組拆分為多個數(shù)組。
np.split(ary, indices_or_sections, axis=0)
ary:要切分的數(shù)組
indices_or_sections:如果是一個整數(shù),就用該數(shù)平均切分,如果是一個數(shù)組,為沿軸切分的位置
axis:沿著哪個維度進行切向,默認為0,橫向切分
- 一維數(shù)組切分
import numpy as np
x = np.array([0,1,2,3,4,5,6,7,8])
print (np.split(x,3))
print (np.split(x,[3,5,6,9]))
print(np.split(x,[3,5,6,8]))
Out[ ]:
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
[array([0, 1, 2]), array([3, 4]), array([5]), array([6, 7, 8]), array([], dtype=int32)]
[array([0, 1, 2]), array([3, 4]), array([5]), array([6, 7]), array([8])]
一維數(shù)組只有一個維度,所以切分只會在這一個維度進行。第一行輸出對應(yīng)indices_or_sections參數(shù)為一個整數(shù),將數(shù)組平均分成了三份,第二行輸出對應(yīng)indices_or_sections參數(shù)為一個數(shù)組,此時每一次切分都會將要切分數(shù)組的前n(n=3,5,6,9)個元素切分出來,第一次n=3,進行數(shù)組切分得到array([0, 1, 2]),第二次n=5,進行數(shù)組切分得到array([3, 4]),此時數(shù)組前5個元素已經(jīng)切分完畢,后續(xù)同理,最后一次n=9,切分完畢后數(shù)組所有元素已經(jīng)被切分,所以最后一個array為array([], dtype=int32),對比第三行輸出可以看出區(qū)別。
- 二維數(shù)組切分
a = np.array([[1,2,3],
[1,2,5],
[4,6,7]])
print (np.split(a, [2, 3],axis = 0))
print (np.split(a, [1, 2],axis = 1))
Out[ ]:
[array([[1, 2, 3],
[1, 2, 5]]), array([[4, 6, 7]]), array([], shape=(0, 3), dtype=int32)]
[array([[1],
[1],
[4]]), array([[2],
[2],
[6]]), array([[3],
[5],
[7]])]
同樣,二維數(shù)組的切分也是同理。第一行按第一個和第二個數(shù)組作為第一個切分,第三個數(shù)組作為第二個切分,后面已經(jīng)沒有數(shù)組,所以第三個切分為空值。
3.4 數(shù)組轉(zhuǎn)置和軸對換
可以通過transpose方法進行轉(zhuǎn)置。除了使用transpose方法外,也可以用T屬性進行數(shù)組的轉(zhuǎn)置,等同于transpose函數(shù)不帶參數(shù)的效果。
import numpy as np
arr=np.arange(12).reshape(3,4)
Out[ ]: array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
arr.transpose((1,0))
arr.T
Out[ ]: array([[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]])
- transpose和swapaxes函數(shù)講解
arr=np.arange(16).reshape(2,2,4)
arr
Out[ ]: array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.transpose(2,1,0)
Out[ ]: array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
arr這個數(shù)組有三個維度,三個維度的編號對應(yīng)為(0,1,2),比如這樣,我們需要拿到7這個數(shù)字,怎么辦,肯定需要些三個維度的值,7的第一個維度為0,第二個維度為1,第三個3,所以arr[0,1,3]則拿到了7。再回到transpose()這個函數(shù),它里面就是維度的排序,比如我們后面寫的transpose(2,1,0),就是把之前第三個維度轉(zhuǎn)為第一個維度,之前的第二個維度不變,之前的第一個維度變?yōu)榈谌齻€維度,好那么我們繼續(xù)拿7這個值來說,之前的索引為[0,1,3],按照我們的轉(zhuǎn)換方法,把之前的第三維度變?yōu)榈谝痪S度,之前的第一維度變?yōu)榈谌S度,那么現(xiàn)在7的索引就是(3,1,0)同理所有的數(shù)組內(nèi)的數(shù)字都是這樣變的。
arr.swapaxes(2,1) #就是將第三個維度和第二個維度交換
Out[ ]: array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
- 如何更好的理解轉(zhuǎn)置
x = np.arange(4).reshape((2,2))
Out[ ]: array([[0, 1],
[2, 3]])
我們不妨設(shè)第一個方括號“[]”為 0軸 ,第二個方括號為 1軸 ,則x可在 0-1坐標系 下表示如下:

因為 x.transpose((0,1)) 表示按照原坐標軸改變序列,也就是保持不變,而 x.transpose((1,0)) 表示交換 ‘0軸’ 和 ‘1軸’,所以就得到如下圖所示結(jié)果:

我們來看一個三維的:
A = array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])

*該圖形有問題,2軸應(yīng)該是0,1,2,3升序
A.transpose((0,1,2)) #保持A不變
A.transpose((1,0,2)) #將 0軸 和 1軸 交換
A.transpose((1,0,2)) [0][1][2] #根據(jù)上圖這個結(jié)果應(yīng)該是10
———————————————————
以上內(nèi)容均來自書籍或網(wǎng)絡(luò),為個人的學(xué)習(xí)筆記,如有侵權(quán),請聯(lián)系刪帖。