2 數據分析之Numpy模塊(1)

Numpy

Numpy(Numerical Python的簡稱)是高性能科學計算和數據分析的基礎包。它是咱們課程所介紹的其餘高級工具的構建基礎。python

其部分功能以下:編程

  1. ndarray, 一個具備複雜廣播能力的快速且節省空間的多維數組。
  2. 對於整組數據進行快速的運算,無需編寫循環。
  3. 用於讀寫磁盤數據的工具以及用於操做內容映射文件的工具。
  4. 用於集成由C, C++等語言編寫的代碼的工具。

Numpy自己並無提供那麼多高級的數據分析功能,理解Numpy數組以及面向數組的計算將有助於咱們更加高效的使用pandas之類的工具。數組

建立數組 ndarray概述

Numpy最重要的一個特色就是其N緯數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。你能夠利用這種數組對整塊的數據執行一些數學運算。dom

ndarray是一個通用的同構數據多維容器,其中的全部元素必須是相同類型的。每一個數組都有一個shape(表示各維度大小的元組)和一個dtype(表示數組數據類型的對象):函數

咱們將會介紹Numpy數組的基本用法,雖說大多數數據分析工做不須要深刻理解Numpy,但精通面向數組的編程和思惟方式是成爲Python科學計算牛人的一大關鍵步驟。工具

注意: 咱們將依照標準的Numpy約定,即老是使用import numpy as np. 固然你也能夠爲了避免寫np,而直接在代碼中使用from numpy import *, 可是建議你最好仍是不要養成這樣的壞習慣。性能

在界面上的命令行操做

  1. esc切換到命令模式,大數據

  2. 輸入dd 刪除當前單元格ui

  3. a在當前單元格前面增長一個單元格spa

  4. b在當前單元格後面增長一個單元格

建立ndarray

建立數組最簡單的方法就是使用array函數。它接收一切序列型的對象(包括其餘數組),而後產生一個新的含有傳入數據的Numpy數組。

array函數建立數組

import numpy as np

 

建立一維數組

ndarray1 = np.array([1, 2, 3, 4, 5])

ndarray1

查看數組的類型

ndarray1.dtype

查看數組的shape(看維數和數組的長度,一維的只顯示數組的長度)

ndarray1.shape

  

建立二維數組 

這裏要用一個大列表,把裏面的數組包起來 

ndarray2 = np.array([[1, 2, 3, 4], [2, 4, 6, 8]]) 

ndarray2

 

查看數組的shape 

 

查看數組的類型

ndarray2.dtype

建立一個字符數組

ndarray3 = np.array(list('abcdefg'))
ndarray3

  

 查看數組的類型

ndarray3.dtype

  

 查看數組的shape

ndarray3.shape

  

 

zeros和zeros_like建立數組

它的類型是Float

用於建立數組,數組元素默認值是0. 注意:zeros_linke函數只是根據傳入的ndarray數組的shape來建立全部元素爲0的數組,並非拷貝源數組中的數據.

ndarray3 = np.zeros(5)
ndarray3

查看類型

ndarray3.dtype

zeros_like  

ndarray4 = np.zeros((2, 2))

ndarray4[0][0] = 100

ndarray4

  

like版本的函數表示按照參數的shape建立數組

ndarray5 = np.zeros_like(ndarray4)
ndarray5

  

值並不和 ndarray4 的值同樣,只是和它的維度和長度有關

ones和ones_like建立數組

用於建立全部元素都爲1的數組.ones_like用法同zeros_like用法.

ndarray6 = np.ones([3, 3])

  

np.ones_like(ndarray6)

  

empty和empty_like建立數組

用於建立空數組,空數據中的值並不爲0,而是未初始化的隨機值(垃圾值)

ndarray6 = np.ones([3, 3])
ndarray6

empty_like的用法同上

ndarray7 =np.empty_like(ndarray6)
ndarray7

 eys建立對角矩陣數組

該函數用於建立一個N*N的矩陣,對角線爲1,其他爲0.  

np.eye(5)

  

arange建立數組

 arange函數是python內置函數range函數的數組版本.

#產生0-9共10個元素
ndarray8 = np.arange(10)
ndarray8

 

# 產生10 12 14 16 18, 2爲step
ndarray9 = np.arange(10, 20, 2)
ndarray9

2.2 數據類型

咱們能夠經過ndarray的dtype來打印數組中元素的類型. ndarray常見的數據類型以下:

ul 表示無符號正數,沒有負數

類型 類型代碼 說明
int八、uint8 i一、u1 有符號和無符號的8位(1個字節長度)整型
int1六、uint16 i二、u2 有符號和無符號的16位(2個字節長度)整型
int3二、uint32 i四、u4 有符號和無符號的32位(4個字節長度)整型
float16 f2 半精度浮點數
float32 f4或f 標準單精度浮點數
float64 f8或d 雙精度浮點數
bool ? 布爾類型
object O Python對象類型
unicode_ U 固定長度的unicode類型,跟字符串定義方式同樣
import numpy as np

ndarray1 = np.array([1, 2, 3, 4])
ndarray2 = np.array(list('abcdefg'))
ndarray3 = np.array([True, False, False, True])
class Person(object):
    pass
ndarray4 = np.array([Person(), Person(), Person()])

依次查看類型

ndarray1.dtype

使用astype函數轉換數組類型

ndarray5 = np.array([1, 2, 3, 4, 5])
# 類型轉換完畢返回新的數組
ndarray6 = ndarray5.astype(np.float32)

 

ndarray6.dtype

  

ndarray7 = np.array([1.1, 2.2, 3.3, 4.4])
# 若是浮點數轉換爲整數,則小數部分將會被截斷
ndarray8 = ndarray7.astype(np.int32)
ndarray8

  

 

ndarray9 = np.array(['10', '20', '30', '40'])
# 若是某些字符串數組表示的全是數字,也能夠用astype將其轉換爲數值類型
ndarray10 = ndarray9.astype(np.int32)
ndarray10 

  

 

數組運算

快速切換到Markdown的快捷鍵  Esc +M 

不須要循環便可對數據進行批量運算,叫作矢量化運算. 不一樣形狀的數組之間的算數運算,叫作廣播.  

reshape()函數能夠從新設置數組的shape  

 

ndarray2= np.arange(9).reshape((3,3))
ndarray2

  

數組和數字之間的運算(廣播的形式挨個遍歷)

ndarray3 = np.arange(10)
ndarray3+100

  

 

ndarray3 * 10

  

ndarray2+100

  

數組還能夠進行布爾運算 

ndarray1 = np.arange(10)
ndarray1>2

  

 

1 np.random.randint(0, 10, 5) 隨機產生5個0-10的元素

 

 np.random.randint(0, 10, 5)

 

  

2 np.random.randint(0, 10, (3, 4)) 隨機產生3行4列的元素

np.random.randint(0, 10, (3, 4))

  

數組和數組運算

ndarray4 = np.random.randint(0, 10, 5)
ndarray4

  

ndarray5 = np.random.randint(0, 10, 5)
ndarray5

  

ndarray4 + ndarray5

  

ndarray6 = np.random.randint(0, 10, (3, 4))
ndarray6

  

ndarray7 = np.random.randint(0, 10, (3, 4))
ndarray7

  

ndarray6+ndarray7

ndarray8 = np.random.randint(0, 10, 4)
ndarray8

  

  

ndarray6 + ndarray8

 

一維數組和多維數組進行想加是每一行,每一行進行廣播想加

  

數組索引和切片

Numpy數組的索引是一個內容豐富的主題,由於選取數據子集或單個元素的方式有不少。一維數組很簡單。從表面上看,它們和Python列表的功能差很少。

 

數組索引和切片基本用法

ndarray1 = np.arange(25).reshape((5, 5))
ndarray1  

 

獲取二維數組的第一個元素(數組)

ndarray1[0]

  

獲取二維數組第一個元素的第二個元素

ndarray1[0][1]

  

 獲取二維數組的前三個元素(數組)

ndarray1[:3]

  

 獲取二維數組的前三個元素的前兩個元素

ndarray1[:3][:2]

  

獲取二維數組的前三個元素,每一個元素從2開始切片

ndarray1[:3,2:]

  

注意:

  1. 當把一個數字值賦值給一個切片時,該值會自動傳播到整個選區。跟列表的區別在於,數組切片是原始數組的視圖,這意味着數據不會被賦值,視圖上的任何修改都會直接反應到源數組上.
  2. 你們可能對此感到不解,因爲Numpy被設計的目的是處理大數據,若是Numpy將數據複製來複制去的話會產生何等的性能和內存問題.
  3. 若是要獲得一個切片副本的話,必須顯式進行復制操做.

數組花式索引

ndarray2 = np.empty((8,8))

for val in range(8):
    ndarray2[val]= np.arange(val,val+8)

ndarray2

  

獲取指定下標元素的集合

ndarray2[[1,3,5]]

  

獲取篩選後的1,2元素

ndarray2[[1,3,5]][[1,2]]

獲取篩選後每一個元素的第0個元素

ndarray2[[1,3,5],0]

  

獲取篩選後每一個元素,從下標0開始切片到2

ndarray2[[1,3,5],:2]

  

獲取每一個元素的指定的元素  

ndarray2[[1,3,5],[0,1,2]]

  

布爾型索引

# 獲取一個隨機3行4列的數組
country_data = np.random.randint(1000,10000,(4,3))
country_data

  

添加行索引

country_index = np.array(['中國','美國','德國','法國'])
country_index 

  

country_index == '美國'

  

# 也就是一個數組裏面又嵌套了一個數組
country_data[country_index == '美國']

  

添加列索引

country_col=np.array(['經濟','軍事','人口'])

 

# 先計算軍事這個元素在數組中第幾個位置
np.argwhere(country_col == '軍事')

取出這個位置

np.argwhere(country_col == '軍事')[0][0]

獲取法國的人口

country_data[country_index == '法國'][0][np.argwhere(country_col == '人口')[0][0]]

  

  

查看元素在數組中的第幾個位置  

np.argwhere(條件)

 

np.argwhere(country_data == 8377)

  

布爾類型數組跟切片、整數混合使用
names = np.array(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg'])
data = np.arange(35).reshape((7, 5))

data

  

ret1 = data[names == 'ccc']
ret1

  

 布爾類型數組和整數混合使用

ret2= data[names == 'ccc', 2]
ret2

  

布爾類型數組和切片混合使用

ret3= data[names == 'ccc', 1:]
ret3

  

使用不等於!=,使用(~)對條件否認
ret1 = data[names != 'ccc']
ret1

  

ret2 = data[~(names == 'ccc')]
ret2

  

ret3 = data[~(names > 'ccc')]
ret3

  

使用&(和)、|(或)組合多個布爾條件
ret1 = data[(names == 'aaa') | (names == 'ccc')]
ret1

  

ret2 = data[(names > 'ddd') | (names == 'aaa')]
ret2

  

ret3 = data[(names < 'eee') & (names > 'bbb') ]
ret3

  

使用布爾類型數組設置值是一種常常用到的手段
ndarray1 = np.arange(5)
ndarray2 = np.arange(16).reshape((4, 4))
names = np.array(['aaa', 'bbb', 'ccc', 'ddd'])

將數組ndarray1中全部大於2的元素設置成666  

ndarray1[ndarray1 > 2] = 666
ndarray1

  

將ndarray2的aaa這一行全部的元素設置爲0

ndarray2[names == 'aaa'] = 0
ndarray2

  

將ndarray2的bbb這一行2位置日後全部的元素設置爲1

ndarray2[names == 'bbb', 2:] = 1
ndarray2

  

將ndarray2的ccc ddd這2行全部的元素設置爲2

ndarray2[(names == 'ccc') | (names == 'ddd')] = 2
ndarray2

  

zip 函數的使用

zip([列表1],[列表2])用法,拿列表中1的值,在拿列表2中的值,進行一一對應 

for a,b in zip([ True,  True, False,  True,  True,  True,  True],data):
    print(a,b)

  

# 只取爲真的值
for a,b in zip([ True,  True, False,  True,  True,  True,  True],data):
    if a:
        print(a,b)

  

 np.where用法

np.where()函數的使用-----------> np.where(條件,知足條件是什麼值,不知足條件是什麼值)

ndarray1 = np.random.randint(-10, 10, (5, 5))
ndarray1

  

把數組中小於0的值改成100
np.where(ndarray1<0,100,ndarray1)

  

將數組中大於-3小於3的值改成100
np.where(ndarray1>-3,np.where(ndarray1<3,100,ndarray1),ndarray1)

  

相關文章
相關標籤/搜索