pandas and numpy notebook 最近工作交接,整理電腦資料時看到了之前的基於Jupyter學習數據分析相關模塊學習筆記。想著拿出來分享一下,可是Jupyter導出來html文件,博客園不支持js註入,貼圖效果實在太差勁兒。所以只貼了內容,要是有需要文件原版(pdf、md、html ...
pandas and numpy notebook
最近工作交接,整理電腦資料時看到了之前的基於Jupyter學習數據分析相關模塊學習筆記。想著拿出來分享一下,可是Jupyter導出來html文件,博客園不支持js註入,貼圖效果實在太差勁兒。所以只貼了內容,要是有需要文件原版(pdf、md、html等)可以在評論區說一下。 本系列是數據分析相關的,打算做一個持續連載,後邊便於自己系統查看和回顧。 另外,本片博客在github上有PDF版本,並且格式也很清爽,請轉https://github.com/xnchall/PandasAndNumpy/blob/master/pdAndNp-01.pdf
pandas和numpy學習系列,主要目的記錄學習中的亮點,以及熟悉對jupyter的使用!
In [3]:import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
1. Series是pandas最基本的1維數據形式,存儲內容的數據類型任意。pd.Series(data, index=[])data可為字典、np中相關對象。index為數據索引,可以是列表。當有個性化索引時,會按照輸入索引與data匹配數據,如果data沒有匹配到就是設置為 預設值NaN
In [4]:
data = {"a":12, "b":55, "c":50}
pd.Series(data)
Out[4]:
a 12 b 55 c 50 dtype: int64In [5]:
data1 = {'a' : 10, 'b' : 20, 'c' : 30}
pd.Series(data1, index=['b', 'c', 'a', 'd'])
Out[5]:
b 20.0 c 30.0 a 10.0 d NaN dtype: float64
2. ndarray是numpy中定義的多維數組[矩陣模塊]。ndarray對象可以作為pandas中Series的data數據源進行轉換。
ndarray 的一個特點是同構:即其中所有元素的類型必須相同。
NumPy數組的維數稱為秩(rank),一維數組的秩為1,二維數組的秩為2,以此類推。在NumPy中,每一個線性的數組稱為是一個軸(axes),秩其實是描述軸的數量。比如說,二維數組相當於是一個一維數組,而這個一維 數組中每個元素又是一個一維數組。所以這個一維數組就是NumPy中的軸(axes),而軸的數量——秩,就是數組的維數。
data2 = np.random.randn(5)#一維隨機數列表
index = ['a', 'b', 'c', 'd', 'e'] # 指定索引
pd.Series(data2, index)
Out[6]:
a 0.483059 b 0.104168 c 0.413886 d -1.115421 e 1.306849 dtype: float64
2.1 介紹一下Numpy的ndarray對象
In [99]:temp = [[1, 9, 6],[2, 8, 5],[3, 7, 4]]
x = np.array(temp)
print(x.T)#獲得x的轉置矩陣
print(x.size)#獲得數組中元素的個數
print(x.ndim) #獲得數組的維數
print(x.shape) #獲得數組的(行數,列數))
x.flags #返回數組內部的信息
x.flat #將多維數組轉化為1維數組 [1,9,6,2,8,5,3,7,4]
# for i in x.flat:
# print(i)
# x.flat = 2;x#將值賦給1維數組,再轉化成有原有數組的大小形式
y=x.reshape(1,9)#數組轉化為n行m列
print(y)
y.base#獲得該數組基於另外一個對象數組而來,如下,y是根據x而來
np.array(range(15)).reshape(3,5)
[[1 2 3] [9 8 7] [6 5 4]] 9 2 (3, 3) [[1 9 6 2 8 5 3 7 4]]Out[99]:
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
2.2 利用ndarray創建矩陣或者多維數組
In [93]:np.ndarray(shape=(2,3), dtype=int, buffer=np.array([1,2,3,4,5,6,7]), offset=0, order="C")
#創建多維數組形狀shape,
#數據類型dtype,
#初始化數組buffer
#offset含義是 buffer中用於初始化數組的首個數據的偏移
#order含義是 'C':行優先;'F':列優先
#order參數的C和F是numpy中數組元素存儲區域的兩種排列格式,即C語言格式和Fortran語言格式。
Out[93]:
array([[1, 2, 3], [4, 5, 6]])
2.3 ones、zeros、empty系列函數
某些時候,我們在創建數組之前已經確定了數組的維度以及各維度的長度。這時我們就可以使用numpy內建的一些函數來創建ndarray。 例如:函數ones創建一個全1的數組、函數zeros創建一個全0的數組、函數empty創建一個內容隨機的數組,在預設情況下,用這些函數創建的數組的類型都是float64,若需要指定數據類型,只需要閑置dtype參數即可
In [131]:#可以通過元組指定數組形狀
a = np.ones(shape=(2,3))
print(a.dtype)
#也可以通過列表來指定數組形狀,同時這裡指定了數組類型
b = np.zeros(shape=[3,2], dtype=np.int64)
b.dtype
#函數empty創建一個內容隨機的數組
c = np.empty((4,2))
c.dtype
#其他用法
f=[[1,2,3], [3,4,5]]
np.zeros_like(f)
np.ones_like(f)
np.empty_like(f)
float64Out[131]:
array([[1, 2, 3], [3, 4, 5]])
2.4 arange、linspace與logspace
1> arange函數類似python中的range函數,通過指定初始值、終值以及步長(預設步長為1)來創建數組
2> linspace函數通過指定初始值、閥值以及元素個數來創建一維數組
3> logspace函數與linspace類似,只不過它創建的是一個等比數列,同樣的也是一個一維數組
np.arange(0, 10, 2)
Out[133]:
array([0, 2, 4, 6, 8])In [145]:
np.linspace(0,12, 4)
Out[145]:
array([ 0., 4., 8., 12.])In [139]:
np.logspace(0,2,3)
Out[139]:
array([ 1., 10., 100.])
2.5 fromstring、fromfunction系列函數
1> fromstring函數從字元串中讀取數據並創建數組
2> fromfunction函數由第一個參數作為計算每個數組元素的函數(函數對象或者lambda表達式均可),第二個參數為數組的形狀
str1 = "1,2,3,4,5"
np.fromstring(str1, dtype=np.int64, sep=",")
Out[149]:
array([1, 2, 3, 4, 5], dtype=int64)In [152]:
str2 = "1.01 2.23 3.53 4.76"
np.fromstring(str2, dtype=np.float64, sep=" ")
Out[152]:
array([1.01, 2.23, 3.53, 4.76])In [153]:
def func(i, j):
return (i+1)*(j+1)
In [155]:
np.fromfunction(func, (2,3))#dtype=np.float64
Out[155]:
array([[1., 2., 3.], [2., 4., 6.]])In [156]:
np.fromfunction(lambda i,j: i+j, (3,3), dtype=int)
Out[156]:
array([[0, 1, 2], [1, 2, 3], [2, 3, 4]])
2.6 ndarray創建特殊的二維數組
np中matrix是繼承於採用了ndarray建立的二維數組進行了封裝的子類。特別註意,關於二維數組的創建,依舊是一個ndarray對象,而不是matrix對象。
In [178]:arr = np.arange(9).reshape((3,3))
print(arr)
[[0 1 2] [3 4 5] [6 7 8]]
diag函數返回一個矩陣的對角線元素、或者創建一個對角陣,對角線由參數k控制 [這裡的k就是列的索引]
In [179]:np.diag(arr)#array([0, 4, 8])
np.diag(arr, k=1)#array([1, 5])
np.diag(arr, k=-1)#array([3, 7])
np.diag(np.diag(arr))#array([[0, 0, 0], [0, 4, 0], [0, 0, 8]])
np.diag(np.diag(arr), k=1)
Out[179]:
array([[0, 0, 0, 0], [0, 0, 4, 0], [0, 0, 0, 8], [0, 0, 0, 0]])
diagflat函數以輸入作為對角線元素,創建一個矩陣,對角線有參數k控制
In [182]:np.diagflat([1,2,3], k=1)
Out[182]:
array([[0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3], [0, 0, 0, 0]])In [187]:
np.diagflat([[1,2],[3,4]])
Out[187]:
array([[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]])
tri函數生成一個矩陣,在某對角線以下元素全為1,其餘全為0,對角線由參數k控制
In [198]:np.tri(3,4, k=1, dtype=int)
Out[198]:
array([[1, 1, 0, 0], [1, 1, 1, 0], [1, 1, 1, 1]])
tril函數輸入一個矩陣,返回該矩陣的下三角矩陣,下三角的邊界對角線由參數k控制
In [209]:print(arr)
print("-----------")
print(np.tril(arr, k=0))
print("-----------")
print(np.tril(arr, k=1))
[[0 1 2] [3 4 5] [6 7 8]] ----------- [[0 0 0] [3 4 0] [6 7 8]] ----------- [[0 1 0] [3 4 5] [6 7 8]]
triu函數與tril類似,返回的是矩陣的上三角矩陣
In [210]:np.triu(arr, k=1)
Out[210]:
array([[0, 1, 2], [0, 0, 5], [0, 0, 0]])
vander函數輸入一個一維數組,返回一個範德蒙矩陣
範德蒙行列式
In [215]:np.vander([2,3,4,5])
Out[215]:
array([[ 8, 4, 2, 1], [ 27, 9, 3, 1], [ 64, 16, 4, 1], [125, 25, 5, 1]])In [217]:
np.vander([2,3,4,5],N=2)
Out[217]:
array([[2, 1], [3, 1], [4, 1], [5, 1]])
2.7 ndarray元素訪問
2.7.1 一維數組
一維的ndarray數組可以使用python內置list操作方式
array[beg:end:step]
beg: 開始索引
end: 結束索引(不包含這個元素)
step: 間隔
需要註意的是:
beg可以為空,表示從索引0開始;
end也可以為空,表示達到索引結束(包含最後一個元素);
step為空,表示間隔為1;
負值索引:倒數第一個元素的索引為-1,向前以此減1
負值step:從後往前獲取元素
In [218]:
x1 = np.arange(16)*4#list每個元素*4,list規模不變
In [224]:
x1[0:10:3]
Out[224]:
array([ 0, 12, 24, 36])In [225]:
x1[::-1]#倒置列表---pythonic
Out[225]:
array([60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0])
特別註意的是,ndarray中的切片返回的數組中的元素是原數組元素的索引,對返回數組元素進行修改會影響原數組的值
In [226]:
x1[:-1]
Out[226]:
array([ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56])In [229]:
y = x1[::-1]
y
Out[229]:
array([60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0])In [230]:
y[0]=9999
y
Out[230]:
array([9999, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0])In [232]:
x1
Out[232]:
array([ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 9999])
仔細觀察上邊y和x1操作變化!!
除了上述與list相似的訪問元素的方式,ndarray還可以通過索引列表來訪問,例如:
In [234]:
x1[[0,2,4,5]]##指定獲取索引為0,2,4,5的元素
Out[234]:
array([ 0, 8, 16, 20])
2.7.2 多維數組
多維ndarray中,每一維都叫一個軸(axis)。
在ndarray中軸axis是非常重要的,有很多對於ndarray對象的運算都是基於axis進行,比如sum、mean等都會有一個axis參數(針對對這個軸axis進行某些運算操作)
對於多維數組,因為每一個軸都有一個索引,所以這些索引由逗號進行分割
In [240]:
x2 = np.arange(0,100,5).reshape(4,5)
x2
Out[240]:
array([[ 0, 5, 10, 15, 20], [25, 30, 35, 40, 45], [50, 55, 60, 65, 70], [75, 80, 85, 90, 95]])In [241]:
x2[1,2]#第1行,第2列
Out[241]:
35In [243]:
x2[1:4, 3]#第1行到第4行中所有第3列的元素,實際是第1、2、3行
Out[243]:
array([40, 65, 90])In [245]:
x2[:, 4] #所有行中的所有第4列的元素
Out[245]:
array([20, 45, 70, 95])In [246]:
x2[0:3, :] #第0行到第三行中所有列的元素,實際是第0、1、2行
Out[246]:
array([[ 0, 5, 10, 15, 20], [25, 30, 35, 40, 45], [50, 55, 60, 65, 70]])
需要註意的是:
1> 當提供的索引比軸數少時,缺失的索引表示整個切片(只能缺失後邊的軸)
In [247]:
x2[1:3]
#確實第二個軸,就是只有x軸,沒有y軸。
Out[247]:
array([[25, 30, 35, 40, 45], [50, 55, 60, 65, 70]])
2> 當提供的索引為:時,也表示整個切片
In [250]:
x2[:, 0:4]#:標識兩個軸全部元素,列軸(y軸)範圍是0-4
Out[250]:
array([[ 0, 5, 10, 15], [25, 30, 35, 40], [50, 55, 60, 65], [75, 80, 85, 90]])
3> 可以使用...代替幾個連續的:索引
In [253]:
x2[..., 0:4]
Out[253]:
array([[ 0, 5, 10, 15], [25, 30, 35, 40], [50, 55, 60, 65], [75, 80, 85, 90]])
一維和多維ndarray數組都可以支持迭代!只不過高維迭代需要使用flat做一個降維的操作!
In [255]: