Numpy(Numerical Python的簡稱)是高性能科學計算和數據分析的基礎包。它是咱們課程所介紹的其餘高級工具的構建基礎。python
其部分功能以下:編程
Numpy自己並無提供那麼多高級的數據分析功能,理解Numpy數組以及面向數組的計算將有助於咱們更加高效的使用pandas之類的工具。數組
Numpy最重要的一個特色就是其N緯數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。你能夠利用這種數組對整塊的數據執行一些數學運算。dom
ndarray是一個通用的同構數據多維容器,其中的全部元素必須是相同類型的。每一個數組都有一個shape(表示各維度大小的元組)和一個dtype(表示數組數據類型的對象):函數
咱們將會介紹Numpy數組的基本用法,雖說大多數數據分析工做不須要深刻理解Numpy,但精通面向數組的編程和思惟方式是成爲Python科學計算牛人的一大關鍵步驟。工具
注意: 咱們將依照標準的Numpy約定,即老是使用import numpy as np. 固然你也能夠爲了避免寫np,而直接在代碼中使用from numpy import *, 可是建議你最好仍是不要養成這樣的壞習慣。性能
esc切換到命令模式,大數據
輸入dd 刪除當前單元格ui
a在當前單元格前面增長一個單元格spa
b在當前單元格後面增長一個單元格
建立數組最簡單的方法就是使用array函數。它接收一切序列型的對象(包括其餘數組),而後產生一個新的含有傳入數據的Numpy數組。
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
它的類型是Float
用於建立數組,數組元素默認值是0. 注意:zeros_linke函數只是根據傳入的ndarray數組的shape來建立全部元素爲0的數組,並非拷貝源數組中的數據.
ndarray3 = np.zeros(5) ndarray3
查看類型
ndarray3.dtype
ndarray4 = np.zeros((2, 2)) ndarray4[0][0] = 100 ndarray4
like版本的函數表示按照參數的shape建立數組
ndarray5 = np.zeros_like(ndarray4) ndarray5
值並不和 ndarray4 的值同樣,只是和它的維度和長度有關
用於建立全部元素都爲1的數組.ones_like用法同zeros_like用法.
ndarray6 = np.ones([3, 3])
np.ones_like(ndarray6)
用於建立空數組,空數據中的值並不爲0,而是未初始化的隨機值(垃圾值)
ndarray6 = np.ones([3, 3])
ndarray6
ndarray7 =np.empty_like(ndarray6) ndarray7
該函數用於建立一個N*N的矩陣,對角線爲1,其他爲0.
np.eye(5)
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
咱們能夠經過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
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
不須要循環便可對數據進行批量運算,叫作矢量化運算. 不一樣形狀的數組之間的算數運算,叫作廣播.
ndarray2= np.arange(9).reshape((3,3)) ndarray2
ndarray3 = np.arange(10) ndarray3+100
ndarray3 * 10
ndarray2+100
ndarray1 = np.arange(10) ndarray1>2
np.random.randint(0, 10, 5)
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:]
注意:
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([列表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(條件,知足條件是什麼值,不知足條件是什麼值)
ndarray1 = np.random.randint(-10, 10, (5, 5)) ndarray1
np.where(ndarray1<0,100,ndarray1)
np.where(ndarray1>-3,np.where(ndarray1<3,100,ndarray1),ndarray1)