Numpy庫①

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)系刪帖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容