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等。
我們也可以用比特來指定大小:int64、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-08
python中的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-11
python 請(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-05
Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)CIFAR10圖片進(jìn)行分類方式
這篇文章主要介紹了Pytorch使用卷積神經(jīng)網(wǎng)絡(luò)對(duì)CIFAR10圖片進(jìn)行分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Matplotlib繪圖基礎(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

