1. 程式人生 > >python進階(資料分析numpy庫 二)

python進階(資料分析numpy庫 二)

 2、ndarray陣列的切片:

       (1)陣列切片的基本知識

            各個維度上單獨切片,用 “,” 隔開,用 “:”表示該維度所有的值。

            陣列切片獲得的 新陣列與原資料組共用一個  記憶體空間,切片陣列更改資料原陣列也會更改。

           ndarray 的切片與列表方式切片有一些區別,儘量用陣列方式。

import numpy as np
list1 = [
  [ [1,2,3],
    [3,2,1]],

  [ [4,5,6],
    [6,5,4]],

  [ [7,8,9],
    [9,8,7]]]
arr1 = np.array(list1)

 (一)陣列切片與列表方式切片的區別:

print(arr1[1,:,1:3])  
陣列切片:
[[5 6]
 [5 4]]
print(arr1[1][:][1:3])
列表方式:
[[6 5 4]]

(二)陣列切片用法:

           切第二行的元素
print(arr1[1,:,:])
print(arr1[1])
           
print(arr1[1,:,1:3])
[[5 6]
 [5 4]]

 (2)切片陣列賦值列表或陣列:

賦值列表
import numpy as np
arr1 = np.random.randint(1,9,(3,4))
arr1[:,::2] = [100,100]
print(arr1) 

  [[100   6 100   2]
 [100   6 100   1]
 [100   3 100   5]]

 

賦值陣列
import numpy as np
arr1 = np.random.randint(1,9,(3,12))
arr1[:,::2] = np.array([100,100,100,100,100,100])
print(arr1)

[[100   4 100   3 100   5 100   7 100   8 100   8]
 [100   2 100   1 100   3 100   8 100   3 100   1]
 [100   6 100   1 100   1 100   6 100   8 100   2]]

(3)花式索引:用整數陣列進行索引。

               注意 內部函式  .ix_( 索引陣列1,索引陣列2  ) 的用法。

               也可用轉置( .T )來取與 .ix_()方法一樣的結果。

import numpy as np
arr1 = np.arange(1,31,1).reshape(6,5)
print(arr1)
# 獲得第 2 4 5 行的所有元素
print(arr1[[1,3,4]])
# 注意這裡取的是 (1,1) (3,2) (4,4) 四個元素
print(arr1[[1,3,4],[1,2,4]])
# 取得時是所有 第 2 4 5 行 與 1,2,4列的元素。 用 內部函式  np.ix_( 索引陣列1,索引陣列2  )
print(arr1[np.ix_([1,3,4],[1,2,4])])
# 也可以用轉置 來取,與 np.ix_( )結果相同。
print(arr1[[1,3,4]].T[[1,2,4]].T)

 (4)bool值陣列索引:

                    利用布林型別的陣列進行資料索引,最終返回的結果是對應索引陣列中資料為True位置的值

例項用法:  

    ①  

求陣列 數 > 5 的所有數。
import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
# [[ 1  2  3  4  5]
#  [ 6  7  8  9 10]]
print(arr1 > 5)
# [[False False False False False]
#  [ True  True  True  True  True]]
print(arr1[arr1 > 5])
# [ 6  7  8  9 10]

    ②

            

names = np.array(['joe','tom','anne'])
scores = np.array([[70,80,90],
                   [77,88,91],
                   [80,90,70]])
classes = np.array(['語文','數學','英語'])
# 輸出 joe 的成績
bool_1 = names == 'joe'
print(bool_1)                              [ True False False]
print(scores[bool_1])        #  [[70 80 90]]
# 輸出joe的數學成績
bool_2 = classes == '數學'
print(bool_2)                              [False  True False]
print(scores[bool_1,bool_2])   # [80]
# 第三題
print(scores[(names == 'joe')|(names == 'anne')]) 
# [[70 80 90]
#  [80 90 70]]
#第四題
print(scores[(names != 'joe') & (names != 'anne')])  # [[77 88 91]]

 3、ndarray-陣列轉置與軸對換

        注意陣列轉置與  reshape()的區別

        陣列轉置的基本概念:

             陣列轉置是指將shape進行重置操作,原始的shape值為:(2,3,4),轉置後shape的值為:(4,3,2)。可以通過呼叫陣列的                      物件.transpose(  )  函式或者   物件.T   屬性進行陣列轉置操作。

① 陣列的轉置:

import numpy as np
arr1 = np.arange(1,11,1).reshape(2,5)
1、 利用 T 屬性
arr2 = arr1.T
print(arr2)
2、利用 transpose()函式 
arr3 = arr1.transpose()
print(arr3)
      

② 陣列的軸對換:

import numpy as np
arr1 = np.arange(1,13,1).reshape(2,3,2)
arr2 = arr1.transpose(2,0,1)     中間不用加小()
print(arr2)
[[[ 1  3  5]
  [ 7  9 11]]

 [[ 2  4  6]
  [ 8 10 12]]]

            執行過程:

4、ndarray-陣列拉伸與合併:

①陣列的拉伸:np.tileArep),可以將陣列A進行拉伸,沿著A的維度重複rep

例子:

import numpy as np
arr1 = np.array([[1,2,3],
                 [4,5,6]])
print(np.tile(arr1,3))        # 一個數字為 橫向拉伸 3 倍
print(np.tile(arr1,(3,1)))    # 縱向 拉伸 3倍 ,橫向拉伸 1倍

 ② 陣列的合併:np.stack()函式 

               對於ndarray陣列而言,多個數組可以執行合併操作,合併的方式有多種:

  •                Stack(arrays,axis=0):沿著新的軸加入一個維度   (   axis是座標軸 ,stack 堆 )
  •                vstack():堆疊陣列垂直順序(行)                      
  •                hstack():堆疊陣列水平順序(列)。
  •                stack()函式內部要加 小 ()。
  • import numpy as np
    a = np.array([[1,2,3],
                [4,5,6]])
    b = np.array([[1,2,3],
                [4,5,6]])
    c = np.array([[1,2,3],
                [4,5,6]])
    d = np.array([[1,2,3],
                [4,5,6]])
    e = np.array([1,2,3])
    f = np.array([4,5,6])
    print(np.stack((e,)))   # 注意 : stack 裡面要用小()括起來,預設 axis 為 0 軸。
    print(np.stack((e,),axis=1))
    print(np.stack((e,f),axis=1))

                          

5、ndarray-通用函式/常用函式:(元素級運算)

          ufunc:接受一個或多個標量值,進行快速元素級運算的函式主要包括一元函式和二元函式。

①一元 ufunc:元素級操作,呼叫方法: np . 函式名()。

 

 例子:

 

② 二元ufunc :(元素級操作,其中dot 不是元素級操作)

                      陣列的 點積  不同於 陣列 * 陣列 。

6、聚合函式:

arr1 =np.random.randint(1,11,(3,4))
print(np.max(arr1))     # 求最大值
print(np.min(arr1))
print(np.mean(arr1))     # 平均值
print(arr1.mean()) # 平均值

方差:np.array(  ) 、標準差:np.std(   )

 聚合函式對 某一軸元素進行 聚合:

 7、np. where()函式(三元表示式x if condition else y效果):

                  np.where(condition,arr1,arr2)   滿足條件 選擇arr1,不滿足 選擇arr2

用法:

8、去重函式   np.unique(物件):