Numpy 多維數(shù)據(jù)數(shù)組的實(shí)現(xiàn)
numpy包(模塊)幾乎總是用于Python中的數(shù)值計(jì)算。這個(gè)軟件包為Python提供了高性能的向量、矩陣、張量數(shù)據(jù)類型。它是在C和Fortran中創(chuàng)建的,因此當(dāng)計(jì)算被矢量化(用矩陣和矢量表示操作)時(shí),性能很高。
1.模塊的導(dǎo)入:
%matplotlib inline import matplotlib.pyplot as plt from numpy import *
2.數(shù)組創(chuàng)建numpy
有幾種初始化numpy數(shù)組的方法,例如:使用Python的list或tuple。使用旨在創(chuàng)建Numpy數(shù)組的函數(shù),如arrange、linspace等。從文件中讀取數(shù)據(jù)(例如Python pickle格式)
2.1根據(jù)列表創(chuàng)建numpy.array
v = array([1,2,3,4]) v
M = array([[1, 2], [3, 4]]) M
v和M 都是ndarray類型的對(duì)象,由numpy模塊創(chuàng)建。
type(v), type(M)
v數(shù)組和M數(shù)組的區(qū)別在于它們的尺寸(形式)。我們可以使用ndarray.shape屬性來獲取大小信息。
v.shape
M.shape
矩陣中元素的數(shù)量可以通過屬性ndarray.size
M.size
也可以使用numpy方法numpy.shape
和 numpy.size
shape(M)
size(M)
numpy.ndarray 看起來像一個(gè)普通的 Python 列表。使用它們而不是Python列表有幾個(gè)原因。
Python的列表是非常常見的。它們可以包含任何對(duì)象。他們是動(dòng)態(tài)類型化的。它們不支持矩陣和詩詞作品等數(shù)學(xué)運(yùn)算。由于動(dòng)態(tài)類型的原因,在Python中用list實(shí)現(xiàn)這種操作并不是很有效。
Numpy數(shù)組是靜態(tài)類型化和同質(zhì)化的。元素類型是在創(chuàng)建數(shù)組時(shí)定義的(那么數(shù)組數(shù)據(jù)類型可以改變)。
Numpy數(shù)組不是很耗費(fèi)內(nèi)存。
得益于靜態(tài)類型化,數(shù)學(xué)函數(shù)如乘積和numpy數(shù)組的和可以在編譯語言中實(shí)現(xiàn)(使用C和Fortran)。
使用ndarray數(shù)組的dtype(數(shù)據(jù)類型)屬性,我們可以看到數(shù)組的數(shù)據(jù)類型。
M.dtype
試圖分配一個(gè)錯(cuò)誤類型(不一樣的類型)的值會(huì)導(dǎo)致錯(cuò)誤。
M[0,0] = "hello"
創(chuàng)建數(shù)組時(shí),可以分別指定數(shù)據(jù)類型。
M = array([[1, 2], [3, 4]], dtype=complex) M
通常使用以下dtype值:int、float、complex、bool、object等。
我們也可以用比特來指定大?。篿nt64、int16、float128、complex128。
3.使用函數(shù)生成數(shù)組
使用python列表來指定大型數(shù)組是不切實(shí)際的。你可以使用各種Numpy方法。
3.1arrange
x = arange(0, 10, 1) # arguments: start, stop, step x
x = arange(-1, 1, 0.1) x
3.2linspace 和 logspace
使用linspace,區(qū)間的兩端都被包括在內(nèi),參數(shù):(開始,停止,點(diǎn)的數(shù)量)
linspace(0, 10, 25)
logspace(0, 10, 10, base=e)
3.3mgrid
x, y = mgrid[0:5, 0:5] x y
3.4隨機(jī)數(shù)
#導(dǎo)入所需模塊 from numpy import random
#區(qū)間[0,1]內(nèi)的均勻分布數(shù)。 random.rand(5,5)
#來自于正態(tài)分布的隨機(jī)數(shù) random.randn(5,5)
3.6diag
#對(duì)角矩陣 diag([1,2,3])
#偏移對(duì)角矩陣 diag([1,2,3], k=1)
3.5零和單位矩陣
zeros((3,3))
ones((3,3))
4.文件導(dǎo)入和導(dǎo)出
4.1逗號(hào)分隔的值(CSV)
一個(gè)非常常見的數(shù)據(jù)存儲(chǔ)格式是CSV,以及類似的格式,如TSV(制表分隔值)。要從這些文件中讀取數(shù)據(jù),你可以使用以下方法numpy.genfromtxt
data = genfromtxt('stockholm_td_adj.dat') data.shape
fig, ax = plt.subplots(figsize=(14,4)) ax.plot(data[:,0]+data[:,1]/12.0+data[:,2]/365, data[:,5]) ax.axis('tight') ax.set_title('Температура в Стокгольме') ax.set_xlabel('год') ax.set_ylabel('температура (C)');
使用numpy.savetxt我們可以將數(shù)組保存在CSV中。
M = random.rand(3,3) M
savetxt("random-matrix.csv", M) savetxt("random-matrix.csv", M, fmt='%.5f') # fmt 指定格式
4.2numpy數(shù)組的主要文件格式。
保存和讀取的方法numpy.save
和 numpy.load
save("random-matrix.npy", M) load("random-matrix.npy")
4.3numpy數(shù)組的其他屬性
M.itemsize#每個(gè)byte中的單元數(shù)
M.nbytes#byte數(shù)目
M.ndim#單位數(shù),計(jì)數(shù)
5.使用數(shù)組
5.1編制索引
你可以使用方括號(hào)和索引來選擇數(shù)組的元素。
# v是一個(gè)只有一個(gè)維度的向量,所以一個(gè)索引就足以獲得元素。 v[0]
# M是一個(gè)矩陣(二維數(shù)組),所以需要兩個(gè)索引(行,列)。 M[1,1]
如果我們省略了多維數(shù)組中的索引,就會(huì)返回一些值(一般情況下,N-1維的數(shù)組)。
M
M[1]
M[1,:]#第一行
M[:,1]#第一列
使用索引,你可以為單個(gè)數(shù)組元素賦值。
M[0,0] = 1 M
也適用于行和列
#也適用于行和列 M[1,:] = 0 M[:,2] = -1 M
5.2選擇數(shù)組的一部分
你可以使用M[lower:uperior:step]語法來獲取一個(gè)數(shù)組的一部分。
A = array([1,2,3,4,5]) A
A[1:3]
數(shù)組的部分是可變的:如果給它們分配新的值,那么從它們提取的數(shù)組就會(huì)改變?cè)瓉淼臄?shù)組。
A[1:3] = [-2,-3] A
我們可以省略M[lower:upper:step]中的部分參數(shù)。
A[::]#下限、上限、默認(rèn)步數(shù)
低于零的指數(shù)從數(shù)組的末端開始計(jì)算。
A = array([1,2,3,4,5]) A[-1]#最后一個(gè)元素 A[-3:]#最后三個(gè)元素
索引分區(qū)也適用于多維數(shù)組。
A = array([[n+m*10 for n in range(5)] for m in range(5)]) A
#方陣 A[1:4, 1:4]
#漸進(jìn),帶有指定間隔數(shù) A[::2, ::2]
5.3先進(jìn)的索引方法
數(shù)組的值可以作為選擇項(xiàng)目的索引。
row_indices = [1, 2, 3] A[row_indices]
col_indices = [1, 2, -1] A[row_indices, col_indices]
你也可以使用掩碼:如果掩碼類型為bool,那么根據(jù)掩碼元素的值與相應(yīng)的索引,選擇該元素(True)或不選擇(False)。
B = array([n for n in range(5)]) B
row_mask = array([True, False, True, False, False]) B[row_mask]
row_mask = array([1,0,1,0,0], dtype=bool) B[row_mask]
這個(gè)函數(shù)對(duì)于根據(jù)某些條件從數(shù)組中選擇元素非常有用。
x = arange(0, 10, 0.5) x
mask = (5 < x) * (x < 7.5) mask
x[mask]
5.4從數(shù)組中提取數(shù)據(jù)和創(chuàng)建數(shù)組的函數(shù)。
5.4.1where
索引掩碼可以通過使用以下方法轉(zhuǎn)換為位置索引 where
indices = where(mask) indices
x[indices]#這個(gè)索引相當(dāng)于x[mask]的索引。
5.4.2diag
使用diag函數(shù)還可以提取對(duì)角線和子對(duì)角線元素。
diag(A)
diag(A,-1)
5.4.3take
類似于上述的索引方法。
v2 = arange(-3,3) v2
row_indices = [1, 3, 5] v2[row_indices]
v2.take(row_indices)
但take也可以在列表和其他對(duì)象上工作。
take([-3, -2, -1, 0, 1, 2], row_indices)
5.4.4choose
從多個(gè)數(shù)組中提取數(shù)值。
which = [1, 0, 1, 0] choices = [[-2,-2,-2,-2], [5,5,5,5]] choose(which, choices) # 0th elem of 0 array, 1st elem of 1 array, ...
6.線性代數(shù)
6.1點(diǎn)積運(yùn)算
v1 = arange(0, 5) v1 * 2
v1 + 2
A * 2
A + 2
6.2基礎(chǔ)運(yùn)算
A * A
v1 * v1
A.shape, v1.shape
A * v1
7.矩陣
7.1矩陣
dot(A, A)
dot(A, v1)
dot(v1, v1)
也可以將數(shù)組轉(zhuǎn)換為矩陣的類型。然后再根據(jù)矩陣代數(shù)的規(guī)律進(jìn)行+、-、*的算術(shù)運(yùn)算。
M = matrix(A) v = matrix(v1).T#換位 v
M * M
M * v
v.T * v
v + M*v
8.數(shù)據(jù)處理
shape(data)
8.1平均值
#溫度柱 mean(data[:,3])
過去200年,斯德哥爾摩的平均氣溫在6.2攝氏度左右。
8.2標(biāo)準(zhǔn)差和離散度
std(data[:,3]), var(data[:,3])
8.3sum, prod, и trace
d = arange(0, 10) d
#求和 sum(d)
#所有元素的乘積 prod(d+1) #累計(jì)總和 cumsum(d)
#累積乘積 cumprod(d+1) #和diag(A).sum()一樣 trace(A)
8.4多變量數(shù)據(jù)
m = random.rand(3,3) m
m.max()
#每列最大值 m.max(axis=0)
#每行最大值 m.max(axis=1)
9.改變陣列的形狀和大小
A
n, m = A.shape B = A.reshape((1,n*m)) B
B[0,0:5] = 5 B
A
B = A.flatten() B
B[0:5] = 10 B
#A沒有改變,因?yàn)锽是A的副本,不是同一個(gè)對(duì)象的引用。 A
10.增加一個(gè)新的度量newaxis
v = array([1,2,3]) shape(v)
#向量 -> 單列矩陣 v[:, newaxis]
#尺寸 v[:,newaxis].shape
v[newaxis,:].shape
11.聯(lián)合
b = array([[5, 6]]) a = array([[5, 6]]) concatenate((a, b), axis=0)
concatenate((a, b), axis=1)
12.hstack and vstack
vstack((a,b))
hstack((a,b))
13.Copy и "deep copy"
A = array([[1, 2], [3, 4]]) A
#B等同于A B = A #改變B,將影響A B[0,0] = 10 B
A
B = copy(A) #現(xiàn)在改變B將不再影響A B[0,0] = -5 B
A
14.矩陣的循環(huán)
v = array([1,2,3,4]) for element in v: print(element)
M = array([[1,2], [3,4]]) for row in M: print("row", row) for element in row: print(element)
通過枚舉,可以同時(shí)獲得元素的值和索引。
for row_idx, row in enumerate(M): print("row_idx", row_idx, "row", row) for col_idx, element in enumerate(row): print("col_idx", col_idx, "element", element) # update the matrix M: square each element M[row_idx, col_idx] = element ** 2
#每個(gè)元素現(xiàn)在都是列表 M
到此這篇關(guān)于Numpy 多維數(shù)據(jù)數(shù)組的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Numpy 多維數(shù)據(jù)數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)拷貝/刪除文件夾的方法詳解
這篇文章主要介紹了Python實(shí)現(xiàn)拷貝/刪除文件夾的方法,涉及Python針對(duì)文件夾的遞歸、遍歷、拷貝、刪除等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-08-08python中的GUI實(shí)現(xiàn)計(jì)算器
這篇文章主要介紹了如何利用python中的GUI實(shí)現(xiàn)計(jì)算器,文章教大家用用python的GUI做界面布局,計(jì)算器代碼熟悉控件的使用方法、優(yōu)化計(jì)算器代碼,解決獲取按鈕文本的方法,具有一定的參考價(jià)值,需要的朋友可以參考一下2021-12-12解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':
這篇文章主要給大家介紹了關(guān)于如何解決Python獲取文件提示找不到指定路徑can‘t?open?file?'area.py':[Errno?2]?No?such?file?or?directory的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11python 請(qǐng)求服務(wù)器的實(shí)現(xiàn)代碼(http請(qǐng)求和https請(qǐng)求)
本篇文章主要介紹了python 請(qǐng)求服務(wù)器的實(shí)現(xiàn)代碼(http請(qǐng)求和https請(qǐng)求),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)CIFAR10圖片進(jìn)行分類方式
這篇文章主要介紹了Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)CIFAR10圖片進(jìn)行分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Matplotlib繪圖基礎(chǔ)之動(dòng)畫繪制詳解
matplotlib的動(dòng)畫一直是一個(gè)強(qiáng)大但使用頻率不高的功能,通過動(dòng)畫來展示數(shù)據(jù)和模型的變化過程,可使數(shù)據(jù)的可視化更加生動(dòng)形象,下面就跟隨小編一起學(xué)習(xí)一下Matplotlib是如何繪制動(dòng)畫的吧2023-08-08