前言
大家好!我是初心,本期給大家?guī)淼氖恰尽綨umPy系列】基本操作 - 一。
作者的【 Python 數(shù)據(jù)分析】專欄正在火熱更新中,如果本文對您有幫助,歡迎大家點贊 + 評論 + 收藏 !
每日金句分享:選擇你所喜歡的,愛你所選擇的?!弧?托爾斯泰「托爾斯泰。
一、NumPy介紹
NumPy(
Numerical Python
) 是 Python 語言的一個擴展程序庫,支持大量的維度數(shù)組與矩陣運算,此外也針對數(shù)組運算提供大量的數(shù)學(xué)函數(shù)庫。
NumPy主要用于數(shù)組計算,包含 |
---|
一個強大的N維數(shù)組對象 ndarray |
廣播功能函數(shù) |
整合 C/C++/Fortran 代碼的工具 |
線性代數(shù)、傅里葉變換、隨機數(shù)生成等功能 |
1.1 導(dǎo)入NumPy庫
導(dǎo)入 NumPy 庫是我們的第一步準備工作。在此,還一并導(dǎo)入了以后會用到的 Pandas 庫、 MatplotLib 庫的 pyplot 模塊。
# 導(dǎo)入數(shù)據(jù)分析 ‘三劍客’
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
1.2 查看NumPy版本
# 注意左右都是雙下劃線 ~ ~
np.__version__
1.3 讀取圖片返回NumPy數(shù)組
通過 pyplot 讀取到的圖片,返回的就是一個 NumPy 數(shù)組。
這是我事先準備好的一張圖片 —— tangsan.jpg:
接下來通過 plt 對象讀?。?/p>
n = plt.imread('pic\\tangsan.jpg')
n
輸出過多,這里只展示首尾:
查看數(shù)組形狀:
n.shape
再次顯示圖片:
plt.imshow(n)
二、創(chuàng)建NumPy數(shù)組的十二種方式
2.1 array 和 full
array 函數(shù)用法:numpy.array(object, dtype=None),object 可以為單個值、元組、列表、多維可迭代對象等可迭代對象,作用是創(chuàng)建數(shù)組。
list_one = [1,2,3,4]
# 列表創(chuàng)建
n1 = np.array(list_one)
tuple_one = (1,3,2)
# 元組創(chuàng)建
n2 = np.array(tuple_one,dtype=np.int16)
display(n1,n2)
下面是運行結(jié)果:
full 函數(shù)用法:numpy.full(shape, fill_value, dtype=None),shape 是數(shù)組形狀(可以理解為幾維幾列,一般以元組形式給出),fill_value 是填充的值,dtype 是類型,作用是創(chuàng)建一個值全為同一個的數(shù)組。
# 創(chuàng)建一個二維三列的數(shù)組
n2 = np.full(shape=(2,3),fill_value=1,dtype=np.int16)
n2
2.2 zeros 和 ones
zeros 函數(shù)用法:zeros(shape, dtype=float, order=‘C’),返回一個給定形狀和類型的用0填充的數(shù)組。
n3 = np.zeros((3,3))
n3
ones 函數(shù)用法:np.ones(shape, dtype=None, order=‘C’),返回一個指定形狀和類型的用1填充的數(shù)組。
n4 = np.ones((3,2),dtype=np.float)
n4
2.3 隨機數(shù)數(shù)組
randint 函數(shù)用法:randint(low, high=None, size=None, dtype=‘l’),low 為隨機數(shù)最小值,high 為最大值(取不到),size 在這里等價于 shape ,返回一個指定維度且元素位于 low~high 之間的隨機數(shù)組。
n5 = np.random.randint(1,10,(3,4))
n5
random 函數(shù)用法:random(size),size 等價于 shape ,為行列數(shù),返回一個0~1之間指定形狀的數(shù)組。
n6 = np.random.random((4,2))
n6
rand 函數(shù)用法:rand(d0, d1, …, dn),d0,d1,dn 分別表示1~n個維度的維數(shù),返回一個0-1之間指定維度的數(shù)組,區(qū)別于 random 的是,這個函數(shù)傳參不能傳入帶 ()的元組。
n7 = np.random.rand(3,3)
n7
2.4 服從正態(tài)分布的數(shù)組
randn() 函數(shù)用法:randn(d0, d1, …, dn),創(chuàng)建一個服從標準正態(tài)分布(X ~ N(0,1))的多維數(shù)組。也就是說,產(chǎn)生的數(shù)據(jù)大部分生成在0左右。
n8 = np.random.randn(2,3)
n8
normal()函數(shù)用法:normal(loc=0.0, scale=1.0, size=None),loc 表示均值,scale 表示標準差,size等價于 shape ,創(chuàng)建一個服從正態(tài)分布的多維數(shù)組。
n9 = np.random.normal(1,2,(2,3))
n9
2.5 arrange 和 eye、linspace
eye()函數(shù)用法:np.eye(N, M=None, k=0, dtype=<class ‘float’>, order=‘C’),N 是行數(shù),M 是列數(shù),K 是偏移量,創(chuàng)建一個單位矩陣數(shù)組。
n10 = np.eye(5,5)
n10
linspace()函數(shù)用法:np.linspace(start,stop,num),創(chuàng)建一個包含 num 個數(shù)的等差數(shù)列,公差 d 等于多少由系統(tǒng)計算。
n11 = np.linspace(1,20,3)
n11
arrange()函數(shù)用法:arange([start,] stop[, step,], dtype=None),start 為起始數(shù),stop 為結(jié)束數(shù),創(chuàng)建一個連續(xù)的一維數(shù)組。
n12 = np.arange(1,10,dtype=np.int16)
n12
三、ndarray屬性
維度:ndim ,直接返回維度數(shù)
形狀:shape,數(shù)字有幾個就表示幾維數(shù)組
總長度:size,返回總數(shù)據(jù)量
元素類型:dtype
n1 = np.random.randint(1,10,(3,5))
display(n1)
print("維度:%d,形狀:%s,總長度:%s,元素類型:%s"%(n1.ndim,n1.shape,n1.size,n1.dtype))
四、ndarray基本操作
4.1 索引
在 ndarray 數(shù)組中,索引的使用有兩種等價方式,即 n [M,N] = n [M][N],M表示第一個維度,N表示第二個維度,若不止二維,以此類推,n[M,N,P,……]。
n1 = np.random.randint(1,10,(3,5))
print(n1)
print("n1[2,3]=%s,n1[2][3]=%s"%(n1[2,3],n1[2][3]))
4.2 切片
切片包括行、列切片,可以實現(xiàn)取連續(xù)或不連續(xù)的行或列,也可以復(fù)制、翻轉(zhuǎn)數(shù)組,如果是:, 的寫法,表示第一個維度全取,并且,切片操作都是左閉右開。
一維數(shù)組
- <1> 一個參數(shù):a[i],返回一個數(shù)
- <2> 兩個參數(shù):a[start:stop],對數(shù)組進行切片
- <3>三個參數(shù):a[start,stop,step],對數(shù)組進行切片,step 為步長,當(dāng) step = -1 時表示翻轉(zhuǎn)。
二維數(shù)組
- <1> 取元素:a[i,j],返回第 i 行的第 j 個數(shù)
- <2> 切片:a[xi:xj,yi:yj],返回第 xi ~ xj 行的第 yi ~ yj 列,兩個維度都是左閉右開。
- <3> 切片特殊情況:
左邊從0開始可以省略,右邊到結(jié)尾可以省略
,即 X[:e0,s1:e1] ,表示第1維從第1行開始到第 e0 行;X[s0:,s1:e1],表示從第 s0 行到最后一行。
常用的切片操作如下所示(以二維數(shù)組為例,n1 數(shù)組就是4.1索引中創(chuàng)建的),具體運行結(jié)果,這里不再展示。
print(n1[1:]) # 行切片,取第二行到最后一行
print(n1[:,2:]) # 列切片,取第三列到最后一列
print(n1[:]) # 復(fù)制數(shù)組
print(n1[[0,2]]) # 取不連續(xù)的行,用兩個括號
print(n1[:,[0,2]])# 取不連續(xù)的列
print(n1[::-1]) # 行翻轉(zhuǎn)
print(n1[:,::-1]) # 列翻轉(zhuǎn)
print(n1[::-1,::-1]) # 行列都翻轉(zhuǎn)
如果對某些切片操作有疑問,歡迎大家聯(lián)系我,文末附聯(lián)系方式,我看到后一定會第一時間為大家解答的。
五、實例 - 圖片翻轉(zhuǎn)
我們依舊采用 1.3 中的 tangsan.jpg 圖片,通過對 ndarray 數(shù)據(jù)切片實現(xiàn)圖片翻轉(zhuǎn)效果,這里只展示上下翻轉(zhuǎn)的效果,大家也可以換圖片嘗試。
# 讀取圖片
nd = plt.imread('pic/tangsan.jpg')
# 顯示原圖
plt.imshow(nd)
# 上下翻轉(zhuǎn),通過改變 nd 數(shù)組,將縱軸翻轉(zhuǎn),也就是橫軸逆序?qū)崿F(xiàn)
plt.imshow(nd[::-1])
plt.imshow(nd[:,::-1]) # 左右翻轉(zhuǎn)
六、變形
通過 reshape 函數(shù),我們可以改變數(shù)組的形狀,或者說維度,注意改變后需要重新賦值給數(shù)組。
首先創(chuàng)建好如下的數(shù)組:
n1 = np.array([
[3,5],
[4,2],
[2,3]
])
n1
然后改變形狀:
n1.reshape((6,1))
讓行或列自適應(yīng),通過維數(shù)寫 - 1 實現(xiàn):
n1.reshape((2,-1)) # 行數(shù)為2,列數(shù)自適應(yīng)
n1.reshape(-1,2) # 列數(shù)為2,行數(shù)自適應(yīng)
七、合并與拆分
7.1 合并
concatenate 函數(shù)用法:concatenate((a1, a2, …), axis=0, out=None),a1,a2 表示數(shù)組,axis 表示軸,值為0表示橫向合并,值為1表示縱向合并。
n1 = n1.reshape((2,3))
n2 = np.random.randint(0,10,(2,3))
display(n1,n2)
n3 = np.concatenate((n1,n2),axis=0) # 行合并
n4 = np.concatenate((n1,n2),axis=1) # 列合并
display(n3,n4)
此外,還可以使用 hstack 函數(shù)和 vstack 函數(shù)單獨實現(xiàn)水平合并和垂直合并。相比,concatenate 函數(shù)會更方便些。
n2 = np.random.randint(0,10,(2,3))
n1 = np.random.randint(0,10,(2,3))
display(n1,n2)
n3 = np.hstack((n1,n2)) # 水平合并
n4 = np.vstack((n1,n2)) # 垂直合并
display(n3,n4)
7.2 拆分
split 函數(shù)用法:np.split(ary, indices_or_sections, axis=0),ary:要切分的數(shù)組,indices_or_sections:填入一個整數(shù)或者一個可迭代對象,如果是整數(shù),就切分為整數(shù)個子數(shù)組;如果是可迭代對象,就在該索引位置切分。
將數(shù)組進行拆分為多個數(shù)組,通過 axis (軸),可以控制水平或垂直拆分,具體請看下面的示例。
n3 = n3.reshape((6,2))
display(n3) # 1.查看 n3 數(shù)組
n5 = np.split(n3,2,axis=0) # 橫向切分,均分為2部分
n6 = np.split(n3,1,axis=1) # 縱向切分,均分為1部分
print(n5)
print(n6)
n7 = np.split(n3,[1,3],axis=0) # 在索引為 0 和 3 處切分,切分為3部分
print(n7)
運行結(jié)果:
和合并一樣,也有單獨進行水平拆分和垂直拆分的方法,分別是:hsplit 和 vsplit ,函數(shù)用法參數(shù)都是 np.hsplit(ary, indices_or_sections) ,具體用法這里不再展示。
八、數(shù)組拷貝
使用 copy 函數(shù)創(chuàng)建一個數(shù)組的副本。
n4 = np.copy(n3) # 數(shù)組拷貝
結(jié)語
本期跟大家分享的 “芝士” 就到此結(jié)束了,關(guān)于 NumPy 的基本操作,你學(xué)會了嗎?
?? 好啦,這就是今天要分享給大家的全部內(nèi)容了,我們下期再見! ?
?? 如果你喜歡的話,就不要吝惜你的一鍵三連了~ ??文章來源:http://www.zghlxwxcb.cn/news/detail-548356.html
如果文中有些地方不清楚的話,歡迎聯(lián)系我,我會給大家提供思路及解答。文章來源地址http://www.zghlxwxcb.cn/news/detail-548356.html
相關(guān)導(dǎo)讀
文章直達 | 鏈接 |
---|---|
上期回顧 | 【數(shù)據(jù)分析 - 基礎(chǔ)入門之NumPy③】- 日常難疑解決 |
下期預(yù)告 | 【數(shù)據(jù)分析 - 基礎(chǔ)入門之NumPy⑤】- NumPy基本操作 - 二 |
到了這里,關(guān)于【數(shù)據(jù)分析 - 基礎(chǔ)入門之NumPy④】NumPy基本操作 - 一的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!