1. 程式人生 > >Python---numpy的初步認識

Python---numpy的初步認識

什麼是numpy?

NumPy是Python科學計算的基礎包。
(它提供了多維陣列物件、基於陣列的各種派生物件(例如,masked Array, 矩陣)。除此之外,還提供了各種各樣的加快陣列操作的例程,包括數學基本計算、邏輯、圖形操作、排序、選擇、輸入輸出,離散傅立葉變換、基礎線性代數、基礎統計操作、隨機模擬等等。)

NumPy的核心是ndarray物件。一方面,Ndarray物件封裝了可以包含相同資料型別的多維陣列;另一方面,為獲得更好的效能, 在ndarray上的操作都是在編譯過的程式碼上執行的。此外,和Python自身的序列物件相比,兩者之間有如下不同:

  1. NumPy陣列的大小是固定
    的。Python的List是可以動態增長的。改變NumPy的大小會重新建立一個新的陣列並把原來的刪掉
  2. NumPy陣列中的元素一定是同一型別的。(相應地,每個元素所佔的記憶體大小也是一樣的。)例外情況是:(不是特別理解:one can have arrays of (Python, including NumPy) objects, thereby allowing for arrays of different sized elements.)
  3. NumPy陣列支援在大量資料上進行數學計算和其他型別的操作。通常情況下,與Python自帶的序列型別相比,NumPy陣列上的操作執行更高效,程式碼量也更少。
  4. 越來越多的Python科學計算包都是用到了NumPy的陣列;雖然這些庫支援Python序列型別的輸入,但是內部操作還是要先將其轉換為NumPy的陣列型別,而且輸出通常就是NumPy陣列。所以,如果你想要高效地使用這些Python的科學計算包,僅僅知道Python內建的序列型別是不夠的,你還需要知道如何使用NumPy陣列。

numpy怎麼使用?

  1. 匯入使用包:import numpy as np
  2. 建立ndarray.
    直接建立
arr = np.array([1,3,4,5])
arr = np.array([
                [1,2,3,4],
                [5
,6,7,8] ])
**通過函式方式建立**:參考下文的函式使用

numpy的常用函式有哪些?

  1. ndarray(陣列)基礎屬性函式(axis=0表述列, axis=1表述行)
    .ndim:陣列的維度值
    .shape:陣列的維度的尺度(簡單說就是陣列的形狀)。例如:(2,3,5)
    .size:陣列中所有元素的個數總和(一共都有多少個元素)
    .dtype:陣列中元素的型別(每個數組裡面的型別是一樣的)。例如:int32
    .itemsize:陣列中每個元素的大小(以位元組為單為,每個元素佔4個位元組)

  2. ndarray(陣列)的建立
    注意:函式的相關引數,可以參考pycharm中函式引數的說明
    np.array(list):將列表轉換為ndarray
    np.arange(n):建立多少到多少,步幅為多少的隨機值的ndarray。
    np.ones(shape):生成一個指定形狀的,值全為1的ndarray。(shape是一個形狀定義的元組:(3,2),下面的函式中shape都是這樣的)
    np.zeros(shape):生成一個指定形狀的,值全為0的ndarray。
    np.empty(shap):生成一個指定形狀的陣列,值為一些無效的垃圾資料
    np.full(shape,val):生成一個指定形狀,指定值的ndarray。
    np.eye(n):生成行數等於列數的對角矩陣
    np.ones_like(a):按陣列a的形狀生成全1的陣列
    np.zeros_like(a): 同理
    np.full_like (a, val) : 同理
    np.linspace(1,10,4, endpoint = False): 根據起止資料等間距地生成陣列 ,endpoint 表示10是否作為生成的元素(等差陣列)
    np.logspace(0,9,10):等比陣列
    np.concatenate((ndarray1,ndarray2),axis=0):將兩個ndarray組合起來

注意:linspace 和 logspace預設都是閉合區間取值,第三個引數是元素個數
arange是前閉後開取值,第三個引數是步長

  1. 陣列的維度的轉換
    arr.shape = (x,y) 強制轉換形狀,改變原陣列
    arr.reshape(shape):不改變當前陣列,按shape生成一個新的形狀陣列(與原陣列共享記憶體)返回
    np.swapaxes(arr,ax1,ax2):件兩個維度進行調換
    arr.flatten():對資料進行降維,返回摺疊後的-維陣列
    arr.reshape(-1):也是降維
    注意:維度轉換簡單理解就是陣列中每個元素都有定位的x,y,z標識,維度轉換,就是類似:y,x,z形式生成一個新的x,y,z陣列
    降維可以理解為,從左到右,按照每行的執行順序將資料依次放入新的陣列中

  2. 陣列的型別轉變
    資料型別的轉換:arr.dtype=np.float32 指定當前陣列的資料型別
    arr2 = arr.astype(float) ,根據當前陣列,建立一個指定型別的新陣列
    陣列向列表的轉換:a.tolist()

  3. 陣列的索引和切片
    一維陣列切片
    a = np.array([9,8,7,6,5,4])
    a[1:4:2]==>array([8,6]) [起始編號:終止編號(不含):步長]
    多維陣列切片

arr = np.arange(12).reshape((3, 4)) 
arr[i, :] #取第i行資料
arr[i:j, :] #取第i行到第j行的資料    
arr[:,0] # 取第0列的資料,以行的形式返回的
arr[:,:1] # 取第0列的資料,以列的形式返回的

# 取第一維的索引1到索引2之間的元素,也就是第二行 
# 取第二維的索引1到索引3之間的元素,也就是第二列和第三列
arr[1:2, 1:3] 


# 取第一維的全部 
# 按步長為2取第二維的索引0到末尾之間的元素,也就是第一列和第三列
arr[:, ::2]

簡單的理解就是逗號(,)是維區隔符,多個逗號就多了一個維,冒號(:)是切片方式,一組最多兩個冒號(開始:結束(不包含):步長)
例如一個3維的陣列要切片
arr[開始:結束(不包含):步長 , 開始:結束(不包含):步長, 開始:結束(不包含):步長 ]
最後一維的切片沒冒號,就是行顯示,有冒號就是列顯示了

普通索引陣列
布林索引陣列:
names = np.array([u’張三’,u’張四’,u’張五’])
scores = np.array([
[85,86,87,88],
[95,96,97,98],
[55,56,57,58]
])
classs = np.array([u’語文’,u’數學’,u’物理’,u’化學’])
scores[names == u’張四’].reshape(-1)[classs == u’物理’][0]

花式索引陣列:arr[np.ix_([0,3,5],[0,3,2])]

  1. 陣列的運算
    函式形式運算
    一元函式
    np.abs(a) np.fabs(a) : 取各元素的絕對值
    np.sqrt(a) : 計算各元素的平方根
    np.square(a): 計算各元素的平方
    np.log(a) np.log10(a) np.log2(a) : 計算各元素的自然對數、10、2為底的對數
    np.ceil(a) np.floor(a) : 計算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)
    np.rint(a) : 各元素 四捨五入
    np.modf(a) : 將陣列各元素的小數和整數部分以兩個獨立陣列形式返回
    np.exp(a) : 計算各元素的指數值
    np.sign(a) : 計算各元素的符號值 1(+),0,-1(-)
    np.modf(a):將陣列中元素的小數為和整數位以兩部分獨立陣列的形式返回
    np.isnan(a):返回一個表示“哪些值是NaN(不是一個數字)”的布林型別陣列
    np.isfinite(a), np.isinf(a) : 分別表示“哪些元素是有窮的(非inf,非NaN)”或者“哪些元素是無窮的“的布林型別陣列
    np.cos(arr),np.cosh(arr)
    np.sin(arr), np.sinh(arr)
    np.tan(arr),np.tanh(arr)
    普通以及雙曲型三角函式
    np.arccos(arr), np.arccosh(arr)
    np.arcsin(arr), np.arcsinh(arr)
    np.arctan(arr), np.arctanh(arr)
    反三角函式

二元函式
np.mod(arr1,arr2) 元素級的取模
np.dot(arr1,arr2) 求兩個陣列的點積(矩陣積)
np.greater(arr1,arr2): (arr1 >arr2)
np.less(arr1,arr2) : (arr1 < arr2)
np.equal(arr1,arr2): (arr1 == arr2)
np.less_equal(arr1, arr2):(arr1 <= arr2)
np.greater_equal(arr1,arr2):(arr1

arr = np.array([
[1,2,np.NaN,4],
[4,5,6,np.NaN],
[7,8,9,np.inf],
[np.inf,np.e,np.pi,4]
])
condition = np.isnan(arr) | np.isinf(arr)
print(np.where(condition, 0, arr))
# 滿足條件的值用第二個引數替換
**資料的去重(去重重複值)**

“`
arr2 = np.unique(arr) #返回由單一值構成的從小到大的一維陣列

自己的向量運算
a+b
a-b
a*b
a/b
a%b
a//b
b可也是數字,也可以是nbarray(但是必須和a一樣的形狀)

/************************* 華麗的分割線 **********************************/

資料的CSV檔案存取
CSV (Comma-Separated Value,逗號分隔值) 只能儲存一維和二維陣列

np.savetxt(frame, array, fmt=’% .18e’, delimiter = None): frame是檔案、字串等,可以是.gz .bz2的壓縮檔案; array 表示存入的陣列; fmt 表示元素的格式 eg: %d % .2f % .18e ; delimiter: 分割字串,預設是空格
eg: np.savetxt(‘a.csv’, a, fmt=%d, delimiter = ‘,’ )

np.loadtxt(frame, dtype=np.float, delimiter = None, unpack = False) : frame是檔案、字串等,可以是.gz .bz2的壓縮檔案; dtype:資料型別,讀取的資料以此型別儲存; delimiter: 分割字串,預設是空格; unpack: 如果為True, 讀入屬性將分別寫入不同變數。
多維資料的存取
a.tofile(frame, sep=’’, format=’%s’ ) : frame: 檔案、字串; sep: 資料分割字串,如果是空串,寫入檔案為二進位制 ; format:: 寫入資料的格式
eg: a = np.arange(100).reshape(5, 10, 2)
a.tofile(“b.dat”, sep=”,”, format=’%d’)

np.fromfile(frame, dtype = float, count=-1, sep=’’): frame: 檔案、字串 ; dtype: 讀取的資料以此型別儲存; count:讀入元素個數, -1表示讀入整個檔案; sep: 資料分割字串,如果是空串,寫入檔案為二進位制

PS: a.tofile() 和np.fromfile()要配合使用,要知道資料的型別和維度。

np.save(frame, array) : frame: 檔名,以.npy為副檔名,壓縮副檔名為.npz ; array為陣列變數
np.load(fname) : frame: 檔名,以.npy為副檔名,壓縮副檔名為

np.save() 和np.load() 使用時,不用自己考慮資料型別和維度。

numpy隨機數函式
numpy 的random子庫

rand(d0, d1, …,dn) : 各元素是[0, 1)的浮點數,服從均勻分佈
randn(d0, d1, …,dn):標準正態分佈
randint(low, high,( shape)): 依shape建立隨機整數或整數陣列,範圍是[ low, high)
seed(s) : 隨機數種子

shuffle(a) : 根據陣列a的第一軸進行隨機排列,改變陣列a
permutation(a) : 根據陣列a的第一軸進行隨機排列, 但是不改變原陣列,將生成新陣列
choice(a[, size, replace, p]) : 從一維陣列a中以概率p抽取元素, 形成size形狀新陣列,replace表示是否可以重用元素,預設為False。
eg:
replace = False時,選取過的元素將不會再選取

uniform(low, high, size) : 產生均勻分佈的陣列,起始值為low,high為結束值,size為形狀
normal(loc, scale, size) : 產生正態分佈的陣列, loc為均值,scale為標準差,size為形狀
poisson(lam, size) : 產生泊松分佈的陣列, lam隨機事件發生概率,size為形狀
eg: a = np.random.uniform(0, 10, (3, 4)) a = np.random.normal(10, 5, (3, 4))

numpy的統計函式
sum(a, axis = None) : 依給定軸axis計算陣列a相關元素之和,axis為整數或者元組
mean(a, axis = None) : 同理,計算平均值
average(a, axis =None, weights=None) : 依給定軸axis計算陣列a相關元素的加權平均值
std(a, axis = None) :同理,計算標準差
var(a, axis = None): 計算方差
eg: np.mean(a, axis =1) : 對陣列a的第二維度的資料進行求平均
a = np.arange(15).reshape(3, 5)
np.average(a, axis =0, weights =[10, 5, 1]) : 對a第一各維度加權求平均,weights中為權重,注意要和a的第一維匹配

min(a) max(a) : 計算陣列a的最小值和最大值
argmin(a) argmax(a) : 計算陣列a的最小、最大值的下標(注:是一維的下標)
unravel_index(index, shape) : 根據shape將一維下標index轉成多維下標
ptp(a) : 計算陣列a最大值和最小值的差
median(a) : 計算陣列a中元素的中位數(中值)
eg:a = [[15, 14, 13],
[12, 11, 10] ]
np.argmax(a) –> 0
np.unravel_index( np.argmax(a), a.shape) –> (0,0)

numpy的梯度函式
np.gradient(a) : 計算陣列a中元素的梯度,f為多維時,返回每個維度的梯度
離散梯度: xy座標軸連續三個x軸座標對應的y軸值:a, b, c 其中b的梯度是(c-a)/2
而c的梯度是: (c-b)/1

當為二維陣列時,np.gradient(a) 得出兩個陣列,第一個陣列對應最外層維度的梯度,第二個陣列對應第二層維度的梯度。

影象的表示和變換
PIL, python image library 庫
from PIL import Image
Image是PIL庫中代表一個影象的類(物件)

im = np.array(Image.open(“.jpg”))

im = Image.fromarray(b.astype(‘uint8’)) # 生成
im.save(“路徑.jpg”) # 儲存

im = np.array(Image.open(“.jpg”).convert(‘L’)) # convert(‘L’)表示轉為灰度圖

PS:本博文摘抄自中國慕課大學上的課程《Python資料分析與展示》,推薦剛入門的同學去學習,這是非常好的入門視訊。

相關推薦

python初步認識

基本知識 python在自動化運維方面越做越多,只掌握shell似乎落伍了,在學習python之前先溫習一下什麼是面向過程和麵向物件。 面向過程:以指令為中心,由指令處理資料。組織程式碼解決問題 面向物件:以資料為中心,所有處理程式碼都圍繞資料展開。設計資料結構 bash是

對於python初步認識和學習期望

ava 學習 輸入 發現 語言 開始 初步了解 專業 編程語言 作為一名大一的軟件工程專業新生,我一開始對計算機相關的知識是非常少的,但是進入這個專業之後漸漸開始對這個領域有了一些了解,從一些途徑得知了python這種編程語言,並且得知許多人工智能是以python為基礎的,

Python---numpy初步認識

什麼是numpy? NumPy是Python科學計算的基礎包。 (它提供了多維陣列物件、基於陣列的各種派生物件(例如,masked Array, 矩陣)。除此之外,還提供了各種各樣的加快陣列操作的例程,包括數學基本計算、邏輯、圖形操作、排序、選擇、輸入輸出,

python 初步認識Flask

傳參 步驟 json 進一步 第一個程序 _id 方式 folder 匹配 1.簡介 flask 問題一: 訪問百度的流程? a. 客戶端: 發送請求報文, 請求行, 請求頭, 請求體 b.服務端: 解析請求的報文, 解析域名, 進行路由匹配分發找到對應的視圖函數,

兄弟連學Python(4)—Python前端HTML與CSS初步認識

什麼是HTML? HTML: 超文字標記語言,標準通用標記語言下的一個應用。 “超文字”就是指頁面內可以包含圖片、連結,甚至音樂、程式等非文字元素。 超文字標記語言的結構包括“頭”部分(英語:Head)、和“主體”部分(英語:Body),其中“頭”部提供關於網頁的資

Python中協程(coroutine)的初步認識

基本概念的認識 之前在瀏覽相關文章gevent原始碼分析時對協程和程序做了相關比較。 相同點:二者都是可以看做是一種執行流, 該執行流可以掛起,並且在將來又可以在 你掛起的地方恢復執行,

Python遊戲編程--初步認識pygame】

get() 傳遞 posit 進程 local spl 鋸齒 基礎 邊緣 一、pygame簡介 Pygame 是一組用來開發遊戲軟件的 Python 程序模塊,基於 SDL 庫的基礎上開發。允許你在 Python 程序中創建功能豐富的遊戲和多媒體程序,Pygame 是一個

Python基礎總結之初步認識---clsaa類(上)。第十四天開始(新手可相互督促)

最近的類看著很疼,堅持就是勝利~~~ python中的類,什麼是類?類是由屬性和方法組成的。類中可能有很多屬性,以及方法。 我們這樣定義一個類:          前面是class關鍵字 後面school是一個類的名字,在後面就是圓括號和括號裡面的object

lvs初步認識

lvslinux Cluster:Cluster:計算機集合,為解決某個特定問題組合起來形成的單個系統:類型:LB:Load Balancing,負載均衡:HA:High Availiablity ,高可用:HP:High Performance,高性能:分布式系統:分布式存儲分布式計算系統擴展方式:Scal

Ajax的初步認識

無需 這樣的 感受 等待 nbsp rip 取數據 line 接受 在學習php的時候多次看到AjaX的字眼,今日特地上網了解了一下 看來,來日一定會跟它打交道的! 什麽是Ajax Ajax是Asynchronous JavaScript and XML的縮寫,這一

[轉]OData的初步認識 OData v4 Client Code Generator

序列 基礎 sta turn out 查詢語句 sql查詢 delete fig 本文轉自:http://www.cnblogs.com/1zhk/p/5356053.html What – OData是什麽? OData - Open Data Proto

初步認識ASP.NET WebForm

兩個 vs2012 asp 本地ip 管理器 bsp ipc 器) 開發框架 C#可已進行以下兩大類的開發 一.客戶端應用程序C/S 主要有兩種開發技術: 1.winForm windows窗體應用程序 2.WPF微軟新一代圖形框架 MFC(比較老的開發技術) MVVM(客

ZeroMQ 初步認識

details get 消息隊列 war html htm .html mda 隊列 http://www.danieleteti.it/zeromq-for-delphi/ https://my.oschina.net/zeroflamy/blog/109457 ht

對前端語言的初步認識

再次 思維 非阻塞io 事件驅動 特效 strong 而且 語言 情況 web前端,首先不是孤立存在的,前端相對於web後端編程而言,前端是瀏覽器自身支持的編程語言,主要包括html,css,javascript等 HTML: 是構成網頁展示的基礎,主要是復負責頁面的內容顯

初步認識hadoop的一些總結

hadoop<iframe id="embed_dom" name="embed_dom" frameborder="0" style="display:block;width:525px; height:245px;" src="https://www.processon.com/embed/mind

簡單的初步認識Java這門編程語言

java初步認識 java jdk JAVA的誕生:Java於1995年由SUN公司研發推出。Java發展:因為其使用免費,眾多開源插件和類庫,先進的語法面向對象等特性,使得其受到開發人員的喜愛和發展。並且因為其免費開源,有許多的無名工程師、極客在為java進行完善和開發。 Oracle:SUN公

Python--Numpy安裝

安裝 ads ges 自己的 col 上網 style 3.6 什麽 1.Numpy簡介 NumPy系統是Python的一種開源的數值計算擴展,一個用python實現的科學計算包。 2.下載 下載地址:https://pypi.python.org/pypi/numpy#d

OpenStack入門 之 初步認識

openstack入門 之 初步認識從 OpenStack 基礎知識開始學起,剖析 openstack 架構,分析 OpenStack 的各個組件的功能、原理和使用方法,通過實戰演練來掌握 OpenStack 的部署和操作。為今後學習 OpenStack 的高級課程以及基於 OpenStack 構建企業級雲計

設計模式的初步認識

屬性 eight pat ica nts 第三方類 height 觀察者 橋接 http://blog.csdn.net/zhangerqing/article/details/8194653/ http://www.cnblogs.com/java-my-life/arc

Python初步學習-引號

引號 spa 想要 href invalid 基本 -- 輸出 clas (參考教材:簡明Python教程) 地址:http://www.kuqin.com/abyteofpython_cn/ ----------------------------------------