天天看點

資料分析之上篇---numpy子產品

目錄

  • 一、簡介
  • 二、ndarray -多元數組對象
    • 1、為什麼要是用ndarray?
    • 2、建立ndarray對象
    • 3、ndarray多元數組建立
    • 4、常用屬性
    • 5、資料類型
    • 6、ndarray 數組建立
    • 7、數組運算和轉換
      • 數組和标量(數字)之間運算
      • 一維數組與多元數組之間的轉換
    • 8、索引和切片
      • 索引取值
      • 切片
      • 布爾型索引
  • 三、通用函數
    • 1、一進制函數
    • 2、二進制函數
    • 3、數學統計方法
    • 4、随機數

一、簡介

資料分析之上篇---numpy子產品
Numpy是高性能科學計算和資料分析的基礎包。它也是pandas等其他資料分析的工具的基礎,基本所有資料分析的包都用過它。NumPy為Python帶來了真正的多元數組功能,并且提供了豐富的函數庫處理這些數組。它将常用的數學函數都支援向量化運算,使得這些數學函數能夠直接對數組進行操作,将本來需要在Python級别進行的循環,放到C語言的運算中,明顯地提高了程式的運算速度。

安裝方法:

pip install numpy

在jupyter中:需要加!,!pip3 install numpy

引用方式:

import numpy as np

這是官方認證的導入方式,可能會有人說為什麼不用

from numpy import *

,是因為在numpy當中有一些方法與Python中自帶的一些方法,例如

max

min

等沖突,為了避免這些麻煩大家就約定俗成的都使用這種方法。

二、ndarray -多元數組對象

資料分析之上篇---numpy子產品

Numpy的核心特征就是N-維數組對——ndarray.

1、為什麼要是用ndarray?

接下來我們可以通過具體的執行個體來展示一下ndarray的優勢。

現在有這樣一個需求:

已知若幹家跨國公司的市值(美元),将其換算為人民币
           

按照Python當中的方法

第一種:是将所有的美元通過for循環依次疊代出來,然後用每個公司的市值乘以匯率

第二種:通過map方法和lambda函數映射

這些方法相對來說也挺好用的,但是再來看通過ndarray對象是如何計算的

資料分析之上篇---numpy子產品

通過ndarray這個多元數組對象可以讓這些批量計算變得更加簡單,當然這隻它其中一種優勢,接下來就通過具體的操作來發現。

2、建立ndarray對象

import numpy as np
np.array()
           

3、ndarray多元數組建立

接下來就多元數組舉個例子:

資料分析之上篇---numpy子產品

有的人可能會說了,這個數組跟Python中的清單很像啊,它和清單有什麼差別呢?

  • 數組對象内的元素類型必須相同
  • 數組大小不可修改

4、常用屬性

屬性 描述
T 數組的轉置(對高維數組而言)
dtype 數組元素的資料類型
size 數組元素的個數
ndim 數組的維數
shape 數組的次元大小(以元組形式)
T:轉置
就相當于是将行變成列,列變成行,它也是一個比較常用的方法
           
資料分析之上篇---numpy子產品

5、資料類型

  • dtype
類型 描述
布爾型 bool_
整型 int_ int8 int16 int32 int 64
無符号整型 uint8 uint16 uint32 uint64
浮點型 float_ float16 float32 float64
複數型 complex_ complex64 complex128
整型:
int32隻能表示(-2**31,2**31-1),因為它隻有32個位,隻能表示2**32個數

無符号整型:
隻能用來存正數,不能用來存負數

補充:
astype()方法可以修改數組的資料類型
           
資料分析之上篇---numpy子產品

6、ndarray 數組建立

方法 描述
array() 将清單轉換為數組,可選擇顯式指定dtype
arange() range的numpy版,支援浮點數
linspace() 類似arange(),第三個參數為數組長度
zeros() 根據指定形狀和dtype建立全0數組
ones() 根據指定形狀和dtype建立全1數組
empty() 根據指定形狀和dtype建立空數組(随機值)
eye() 根據指定邊長和dtype建立機關矩陣
# 1、arange()使用:
>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3.0)
array([ 0.,  1.,  2.])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,7,2)
array([3, 5])

-----------------------------------------------------------------
# 2、linspace()的使用
	#解釋:在1-10之間等比生成5個數,預設顧頭顧尾。endpoint=False顧頭不顧尾
    	# 每個數字之間的距離相等的,前後兩個數做減法肯定相等
np.linspace(1,10,5)
執行結果:
array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ])

np.linspace(1,10,5,endpoint=False)
執行結果:
array([1. , 2.8, 4.6, 6.4, 8.2])

----------------------------------------------------------------
# 3、zeros()  # 建立全0數組占位
>>> np.zeros(5)
array([ 0.,  0.,  0.,  0.,  0.])

>>> np.zeros((5,), dtype=int)
array([0, 0, 0, 0, 0])

>>> np.zeros((2, 1))
array([[ 0.],
       [ 0.]])

>>> s = (2,2)
>>> np.zeros(s)
array([[ 0.,  0.],
       [ 0.,  0.]])

---------------------------------------------------------------------
# 4、ones()  # 廚房間全為1的數組占位
>>> np.ones(5)
array([1., 1., 1., 1., 1.])

>>> np.ones((5,), dtype=int)
array([1, 1, 1, 1, 1])

>>> np.ones((2, 1))
array([[1.],
       [1.]])

>>> s = (2,2)
>>> np.ones(s)
array([[1.,  1.],
       [1.,  1.]])
------------------------------------------------------------------------
# 5、empty() 
np.empty(10)
執行結果:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 這個方法隻申請記憶體,不給它指派
-----------------------------------------------------------------------
# 6、eye()  # 生成對稱矩陣  k控制向右偏移量
np.eye(5)
執行結果:
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])
>>> np.eye(2, dtype=int)
array([[1, 0],
       [0, 1]])

>>> np.eye(5,k=2)
array([[0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
           

7、數組運算和轉換

數組和标量(數字)之間運算

arr = np.array([1,2,3,4,5,6])
arr*2
# 執行結果:
array([ 2,  4,  6,  8, 10, 12])

-----------------------------------------------------------------------
arr = np.array([1,2,3,4,5,6])
arr1 = np.array([11,22,33,44,55,66])
arr*arr1
# 執行結果:
array([ 11,  44,  99, 176, 275, 396])

arr+arr1
# 執行結果:
array([12, 24, 36, 48, 60, 72])
           

一維數組與多元數組之間的轉換

# 一維數組-->多元數組
res1 = np.arange(30).reshape(5,-1)   # -1無任何作用,占位。系統自動算出幾列
res1
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29]])

# 多元數組-->一維數組
res2 = res1.reshape(30)
res2
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])

           

8、索引和切片

索引取值

# 多元數組索引使用方法
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29]])
現在有這樣一組資料,需求:找到20
清單寫法:arr[3][2]
數組寫法:arr[3,2]  # 中間通過逗号隔開就可以了

# 一維數組索引使用
array([1, 2, 3, 4, 5, 6])
arr[0]  # 1
arr[2] # 3


# 花式索引,清單裡放索引。需要提前知道索引
array([1, 2, 3, 4, 5, 6])
arr[[0,3]]  # array([1, 4])
           

切片

# 一維數組切片:和python一至
array([1, 2, 3, 4, 5, 6])
arr[0:2]  # array([1, 2]
arr[::-1]  # array([6, 5, 4, 3, 2, 1])
arr[::2]  # array([1, 3, 5])


# 多元數組切片:arr[行:列]
arr數組
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29]])
arr[1:4,1:4]   # 切片方式
執行結果:
array([[ 7,  8,  9],
       [13, 14, 15],
       [19, 20, 21]])
           

布爾型索引

現在有這樣一個需求:給一個數組,選出數組種所有大于5的數。

array([1, 2, 3, 4, 5, 6])

arr > 4
array([False, False, False,  True,  True,  True])

取值:
arr[arr>3]
array([4, 5, 6])
           

三、通用函數

資料分析之上篇---numpy子產品
能對數組中所有元素同時進行運算的函數就是通用函數

常見通用函數:

能夠接受一個數組的叫做一進制函數,接受兩個數組的叫二進制函數,結果傳回的也是一個數組

1、一進制函數

函數 功能
abs、fabs 分别是計算整數和浮點數的絕對值
sqrt 計算各元素的平方根
square 計算各元素的平方
exp 計算各元素的指數e**x
log 計算自然對數
sign 計算各元素的正負号
ceil 計算各元素的ceiling值
floor 計算各元素floor值,即小于等于該值的最大整數
rint 計算各元素的值四舍五入到最接近的整數,保留dtype
modf 将數組的小數部分和整數部分以兩個獨立數組的形式傳回,與Python的divmod方法類似
isnan 計算各元素的正負号
isinf 表示那些元素是無窮的布爾型數組
cos,sin,tan 普通型和雙曲型三角函數

2、二進制函數

函數 功能
add 将數組中對應的元素相加
subtract 從第一個數組中減去第二個數組中的元素
multiply 數組元素相乘
divide、floor_divide 除法或向下圓整除法(舍棄餘數)
power 對第一個數組中的元素A,根據第二個數組中的相應元素B計算A**B
maximum,fmax 計算最大值,fmax忽略NAN
miximum,fmix 計算最小值,fmin忽略NAN
mod 元素的求模計算(除法的餘數)
資料分析之上篇---numpy子產品
補充内容:浮點數特殊值

浮點數:float

浮點數有兩個特殊值:

1、nan(Not a Number):不等于任何浮點數(nan != nan)
---------------------------------------------
2、inf(infinity):比任何浮點數都大
---------------------------------------------
           
  • Numpy中建立特殊值:np.nan、np.inf
  • 資料分析中,nan常被用作表示資料缺失值
資料分析之上篇---numpy子產品

3、數學統計方法

函數 功能
sum 求和
cumsum 求字首和
mean 求平均數
std 求标準差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引

4、随機數

随機數生成函數在np.random的子包當中

常用函數

函數 功能
np.random.rand 給定形狀産生随機數組(0到1之間的數)
np.random.randint 給定形狀産生随機整數
np.random.chocie 給定形狀産生随機選擇
np.random.shuffle 與random.shuffle相同
np.random.uniform 給定形狀産生随機數組
資料分析之上篇---numpy子產品