1. 程式人生 > >jupter nootbok 快捷鍵、NumPy模塊初識

jupter nootbok 快捷鍵、NumPy模塊初識

數組運算 imu nim function head point 操作 spl 水平

jupter nootbok 快捷鍵

插入cell:a b
刪除cell:x
cell模式的切換:m:Markdown模式 y:code模式
運行cell:shift+enter
tab:補全
shift+tab:打開幫助文檔

NumPy

NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。

一、創建ndarray

1. 使用np.array()創建
一維數據創建
import numpy as np
np.array([1,2,3,4,5],dtype=int)
二維數組創建
np.array([[
1,2,3],[4,5,6],[7.7,8,9]])

註意:
numpy默認ndarray的所有元素的類型是相同的
如果傳進來的列表中包含不同的類型,則統一為同一類型,優先級:str>float>int

使用matplotlib.pyplot獲取一個numpy數組,數據來源於一張圖片

import matplotlib.pyplot as plt
img_arr = plt.imread(bobo.jpg)#當前目錄下的圖片
plt.imshow(img_arr)
img.shape
#(626, 413, 3)#前面兩個數字表示像素,最後一個表示顏色

使用np的routines函數創建數組

包含以下常見創建方法:
1) np.ones(shape, dtype=None, order=C)
np.ones(shape=(4,5),dtype=float)#默認為1
np.zeros(shape, dtype=None, order=C)#默認為0
np.full(shape, fill_value, dtype=None, order=C)
np.full(shape=(6,7),fill_value=999)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) 等差數列
np.linspace(0,
100,20)#返回20個數,等差是5的一維數組 np.arange([start, ]stop, [step, ]dtype=None) arr1 = np.arange(3,10,2) #3是開始,10是結束,2是步長 的一維數組 np.random.seed(10)#固定時間因子 np.random.randint(0,100,size=(3,4))#產生的隨機數固定 array([[ 9, 15, 64, 28], [89, 93, 29, 8], [73, 0, 40, 36]])

註意:只有arange和linspace產生一維數組,其他的都可產生一維或者多維數組

ndarray的屬性

4個必記參數: ndim:維度 shape:形狀(各維度的長度) size:總長度  dtype:元素類型

ndarray的基本操作

1. 索引
一維與列表完全一致 多維時同理
np.random.seed(1)
arr = np.random.randint(0,100,size=(5,5)) 
#根據索引修改數據
arr[1][2] = 6666444
#獲取二維數組前兩行
arr[0:2]
#獲取二維數組前兩列
arr[:,0:2]
#獲取二維數組前兩行和前兩列數據
arr[0:2,0:2]
#將數組的行倒序
arr[::-1]
#列倒序
arr[:,::-1]
#全部倒序
arr[::-1,::-1]
#將圖片進行全倒置操作
plt.imshow(img_arr[::-1,::-1,::-1])
變形
.將一維數組變形成多維數組
array([[     37,      12,      72,       9,      75],
       [      5,      79, 6666444,      16,       1],
       [     76,      71,       6,      25,      50],
       [     20,      18,      84,      11,      28],
       [     29,      14,      50,      68,      87]])
arr.shape
(5, 5)

使用arr.reshape()函數,註意參數是一個tuple!數組元素變形前後要統一!

a.reshape((5,-1))  #-1表示的是自動計算行或列
array([[  37,   12,   72,    9,   75],
       [   5,   79, 9999,   16,    1],
       [  76,   71,    6,   25,   50],
       [  20,   18,   84,   11,   28],
       [  29,   14,   50,   68,   87]])
將多維數組變形成一維數組
a = arr.reshape((25,))
a.shape
(25,)
圖片倒置
img_arr.shape
(626, 413, 3)
img_arr.size
775614
#將原數據三維數組變形成一維數組
arr_1 = img_arr.reshape((775614,))
#將arr_1元素倒置
arr_1 = arr_1[::-1]
#將arr_1變形成三維數組
a_img = arr_1.reshape((626, 413, 3))
plt.imshow(a_img)

級聯

np.concatenate((arr,arr),axis=1)  #0 縱軸  1 橫軸
級聯需要註意的點:
級聯的參數是列表:一定要加中括號或小括號
維度必須相同
形狀相符:在維度保持一致的前提下,如果進行橫向(axis=1)級聯,必須保證進行級聯的數組行數保持一致。如果進行縱向(axis=0)級聯,必須保證進行級聯的數組列數保持一致。
可通過axis參數改變級聯的方向
np.vstack():在豎直方向上堆疊
np.hstack():在水平方向上平鋪

切分

與級聯類似,三個函數完成切分工作:
np.split(arr,行/列號,軸):參數2是一個列表類型
plt.imshow(np.split(img,(400,),axis=0)[0])
np.vsplit
np.hsplit

副本

所有賦值運算不會為ndarray的任何元素創建副本。對賦值後的對象的操作也對原來的對象生效。
可使用copy()函數創建副本
c_arr = arr.copy()
c_arr[1][4] = 100100

ndarray的聚合操作

 求和np.sum
 arr.sum(axis=1)#求行的和
最大最小值:np.max/ np.min
平均值:np.mean()
其他聚合操作
Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements
np.prod    np.nanprod    Compute product of elements
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.var    np.nanvar    Compute variance
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.median    np.nanmedian    Compute median of elements
np.percentile    np.nanpercentile    Compute rank-based statistics of elements
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true
np.power 冪運算

廣播機制

【重要】ndarray廣播機制的三條規則:缺失維度的數組將維度補充為進行運算的數組的維度。缺失的數組元素使用已有元素進行補充。
規則一:為缺失的維度補1(進行運算的兩個數組之間的維度只能相差一個維度)
規則二:缺失元素用已有值填充
規則三:缺失維度的數組只能有一行或者一列

m = np.ones((2, 3))
a = np.arange(3)
display(m,a)
array([[1., 1., 1.],
       [1., 1., 1.]])
array([0, 1, 2])
m+a
array([[1., 2., 3.],
       [1., 2., 3.]])

ndarray的排序

快速排序
np.sort()與ndarray.sort()都可以,但有區別:

np.sort()不改變輸入
ndarray.sort()本地處理,不占用空間,但改變輸入

Pandas的數據結構

1、Series

Series是一種類似與一維數組的對象,由下面兩個部分組成:

values:一組數據(ndarray類型)
index:相關的數據索引標簽

1)Series的創建

import pandas as pd
from pandas import Series,DataFrame
import numpy as np

兩種創建方式:

(1) 由列表或numpy數組創建

默認索引為0到N-1的整數型索引
#使用列表創建Series
Series(data=[1,2,3,4,5],name=bobo)
#使用numpy創建Series
Series(data=np.random.randint(0,10,size=(5,)))
#還可以通過設置index參數指定索引
s = Series(data=np.random.randint(0,10,size=(5,)),index=[a,b,c,d,e])
由字典創建:不能在使用index.但是依然存在默認索引
dic = {
    語文:100,
    數學:90
}
s = Series(data=dic)

Series的索引和切片

可以使用中括號取單個索引(此時返回的是元素類型),或者中括號裏一個列表取多個索引(此時返回的是一個Series類型)。

(1) 顯式索引:

- 使用index中的元素作為索引值
- 使用s.loc[](推薦):註意,loc中括號中放置的一定是顯示索引
註意,此時是閉區間,能取到尾

(2) 隱式索引:

- 使用整數作為索引值
- 使用.iloc[](推薦):iloc中的中括號中必須放置隱式索引
註意,此時是半開區間,取不到尾

切片:隱式索引切片和顯示索引切片
顯示索引切片:index和loc
s[a:d]
s.loc[a:c]
隱式索引切片:整數索引值和iloc
s.iloc[0:3]

Series的基本概念

可以把Series看成一個定長的有序字典

向Series增加一行:相當於給字典增加一組鍵值對
s[g] = 10
可以通過shape,size,index,values等得到series的屬性
s.index
s.values

可以使用s.head(),tail()分別查看前n個和後n個值
s.head(3)
對Series元素進行去重
s.unique()  #返回的是一個ndarray

當索引沒有對應的值時,可能出現缺失數據顯示NaN(not a number)的情況
使得兩個Series進行相加
In [41]:

s1 = Series([1,2,3],index=[a,b,c])
s2 = Series([1,2,3],index=[a,b,d])
s = s1+s2
a    2.0
b    4.0
c    NaN
d    NaN
dtype: float64

可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失數據
s.isnull()
a    False
b    False
c     True
d     True
dtype: bool
s.notnull()
a     True
b     True
c    False
d    False
dtype: bool
s[s.notnull()]#過濾掉空的數據
a    2.0
b    4.0
dtype: float64

Series的運算

1) + - * /
(3) Series之間的運算

在運算中自動對齊不同索引的數據
如果索引不對應,則補NaN
s1 =  Series([1,2,31,2],index=["a","d","s","r"])
s2 = Series([11,2,2,3],index=["a","d","s","b"])
s = s1+s2
a    12.0
b     NaN
d     4.0
r     NaN
s    33.0
dtype: float64

jupter nootbok 快捷鍵、NumPy模塊初識