前言
學習數據分析,必繞不開numpy和pandas這兩個庫,numpy的ndarray數據結構和矩陣數據非常類似,最近搞科研的時候總是會用到,之前學的都忘記完了,所以,這次打算把numpy庫的基本用法記錄在一篇文章里,以便后面復習和使用。
ndarray多維數組創建
不要管復雜的概念,我們把多維數組看做成矩陣就行(實際使用中也是這樣的),例如,下面的二維數據,我們就可以看做成2行3列的矩陣。
import numpy as np
b = np.array([[1,2,3],[4,5,6]])
print(b)
# [[1 2 3]
# [4 5 6]]
一切從創建說起
一個特定的數據結構,肯定有著特定的創建方式,例如列表我們就是通過[]來創建,字典我們用{}來創建。ndarray多維數組用numpy庫的array方法來創建。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- object 數組或嵌套的數列(列表,元祖,數組,或者其他序列類型)
- dtype 數組元素的數據類型,可選
- copy 對象是否需要復制,可選
- order 創建數組的樣式,C為行方向,F為列方向,A為任意方向(默認)
- subok 默認返回一個與基類類型一致的數組
- ndmin 指定生成數組的最小維度
# 1維數組
a = np.array([1,2,3])
print(a)
# [1,2,3]
# 2維數組
b = np.array([[1,2,3],[4,5,6]])
print(b)
# [[1 2 3]
# [4 5 6]]
# 指定數據類型
c = np.array([[1,2,3],[4,5,6]], dtype = np.float64)
print(c)
# reslut
[[1. 2. 3.]
[4. 5. 6.]]
特殊創建方式
numpy也提供了一些函數用于創建特殊的數組。
- zeros,全為0數組;
- ones,全為1數據;
- empty,垃圾值數組。
- full,填充任意值
數值范圍創建數組
我們做循環的時候經常會用到range,可以取數值范圍,numpy中有個arange函數,可用于創建數組。
arr4 = np.arange(9)
arr4
# [0, 1, 2, 3, 4, 5, 6, 7, 8]
這樣創建的數組只能是一維的,arange函數經常和reshape一起使用(后面還會介紹),可以創建多維的數組。
arr5 = np.arange(9).reshape(3,3)
arr5
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
ndarray數據屬性
屬性我們常需要調用的就是ndim,shape和dtype。
- ndarray.ndim 秩,即軸的數量或維度的數量
- ndarray.shape 數組的維度,對于矩陣,n 行 m 列
- ndarray.size 數組元素的總個數,相當于 .shape 中 n*m 的值
- ndarray.dtype ndarray 對象的元素類型
- ndarray.itemsize ndarray 對象中每個元素的大小,以字節為單位
- ndarray.flags ndarray 對象的內存信息
- ndarray.real ndarray元素的實部
- ndarray.imag ndarray 元素的虛部
- ndarray.data 包含實際數組元素的緩沖區,由于一般通過數組的索引獲取元- 素,所以通常不需要使用這個屬性。
arr5 = np.arange(9).reshape(3,3)
print(arr5.ndim)
print(arr5.shape)
print(arr5.dtype)
2
(3, 3)
int64
改變數組數據類型
這個我們經常會用到,例如我們把整數數組轉換為浮點數數組,使用astype方法,用np.float64和'float64'都可以。
切片和索引
這部分內容非常重要,我們經常要選取特定的部分數據來操作,這里就必須要用到切片和索引。
小試牛刀
和列表的切片和索引很類似,都是從0開始計數,一維數組很簡單,也很好理解(和列表一樣操作就行),這里就不多介紹了。
二維數組,選取數據無非就以下幾種情況,選取特定的行,特定的列,或者組合,我們來看看怎么寫。
特定行
特定列
特定的行和列,這部分就有點不一樣了,如果行或者列中有切片,就能得到我們想要的結果,例如獲取2,3行以及1,3列。
如果我們想要獲取1,3行以及1,3列,用這種寫法結果就不對。
這其實獲取的是第一行第一列以及第三行第三列的值,這時候我們就需要用到花式索引。
花式索引
要使用np.ix_來完成。
其實不用這樣寫也可以,就是稍微復雜一點。我們先選取第一行和第三行,選完之后,再選取列。
布爾索引
還有一個很重要的概念,就是布爾索引。
這里有兩個函數需要介紹下,一個是all,一個是any,all是都為True,就返回True,any是一個為True,就返回True。
數組操作
修改數組形狀
之前我們簡單了解過reshape方法,可以改變數組的形狀。通過flatten或者ravel可以將數組從新進行展開。
合并和分割數組
合并數組主要有以下幾種方法:
- concatenate 連接沿現有軸的數組序列
- stack 沿著新的軸加入一系列數組。
- hstack 水平堆疊序列中的數組(列方向)
- vstack 豎直堆疊序列中的數組(行方向)
axis參數就是制定軸的方向,很多numpy函數都有這個參數,但是這個軸又不是很好理解,網上有很多的解釋,我這里說一個很簡單的解釋。例如二維數組,我們索引的時候arr[i,j],i就代表0,j就代表1,也就是說,行的方向就是0,列的方向就是1。
分割數組的函數為:
- split 將一個數組分割為多個子數組
- hsplit 將一個數組水平分割為多個子數組(按列)
- vsplit 將一個數組垂直分割為多個子數組(按行)
numpy.split(ary, indices_or_sections, axis)
- ary:被分割的數組
- indices_or_sections:如果是一個整數,就用該數平均切分,如果是一個數組,為沿軸切分的位置(左開右閉)
- axis:設置沿著哪個方向進行切分,默認為 0,橫向切分,即水平方向。為 1 時,縱向切分,即豎直方向
修改數組
- resize 返回指定形狀的新數組
- append 將值添加到數組末尾
- insert 沿指定軸將值插入到指定下標之前
- delete 刪掉某個軸的子數組,并返回刪除后的新數組
- unique 查找數組內的唯一元素
這里要注意的是,如果不指定軸修改數組,會返回一維數組。
numpy.unique 函數用于去除數組中的重復元素。
numpy.unique(arr, return_index, return_inverse, return_counts)
- arr:輸入數組,如果不是一維數組則會展開
- return_index:如果為true,返回新列表元素在舊列表中的位置(下標),并以列表形式儲
- return_inverse:如果為true,返回舊列表元素在新列表中的位置(下標),并以列表形式儲
- return_counts:如果為true,返回去重數組中的元素在原數組中的出現次數
翻轉數組
- transpose 對換數組的維度
- ndarray.T 和 self.transpose() 相同
- rollaxis 向后滾動指定的軸
- swapaxes 對換數組的兩個軸
numpy.rollaxis 函數向后滾動特定的軸到一個特定位置,格式如下:
numpy.rollaxis(arr, axis, start)
參數說明:
arr:數組
axis:要向后滾動的軸,其它軸的相對位置不會改變
start:默認為零,表示完整的滾動。會滾動到特定位置。
numpy.swapaxes 函數用于交換數組的兩個軸。
數學和統計函數
numpy 包含大量的各種數學運算的函數,包括三角函數,算術運算的函數,復數處理函數等。這里就不一一介紹了,我們著重了解下復數處理函數。
numpy.around() 函數返回指定數字的四舍五入值。
numpy.around(a,decimals)
numpy.floor() 返回小于或者等于指定表達式的最大整數,即向下取整。
numpy.ceil() 返回大于或者等于指定表達式的最小整數,即向上取整。
算數函數
這里不一一介紹了,大家需要用到的時候自查即可。
- add,相加
- subtract,相減
- multiply,相乘
- divide,相除
- reciprocal,函數返回參數逐元素的倒數。如 1/4 倒數為 4/1
- power,第一個輸入數組中的元素作為底數,計算它與第二個輸入數組中相應元素的冪
- mod,計算輸入數組中相應元素的相除后的余數。 函數 numpy.remainder() 也產生相同的結果。
統計函數
numpy 提供了很多統計函數,用于從數組中查找最小元素,最大元素,百分位標準差和方差等。sum,average等等,可以去numpy的官方文檔了解更多。
條件函數
numpy.where() 函數返回輸入數組中滿足給定條件的元素的索引。
numpy.extract() 函數根據某個條件從數組中抽取元素,返回滿條件的元素。
文件的存儲與讀取
- load() 和 save() 函數是讀寫文件數組數據的兩個主要函數,默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為 .npy 的文件中。
- savez() 函數用于將多個數組寫入文件,默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為 .npz 的文件中。
- loadtxt() 和 savetxt() 函數處理正常的文本文件(.txt 等)。
savetxt() 函數是以簡單的文本文件格式存儲數據,對應的使用 loadtxt() 函數來獲取數據。
np.loadtxt(FILENAME, dtype=int, delimiter=' ')
np.savetxt(FILENAME, a, fmt="%d", delimiter=",")
總結
numpy是Python數據科學必學的第三方庫,但是說實話,一上來就學numpy其實是很痛苦的,他不像pandas那么直觀,有很多實際的有趣的案例,所以本篇文章主要是將numpy的基礎語法記錄下來,供大家和自己以后查詢所使用,最后附上numpy小抄給大家,我們下期再見。