Numpy 多維資料陣列的實現
numpy包(模組)幾乎總是用於Python中的數值計算。這個軟體包為Python提供了高效能的向量、矩陣、張量資料型別。它是在C和Fortran中建立的,因此當計算被向量化(用矩陣和矢量表示操作)時,效能很高。
1.模組的匯入:
%matplotlib inline import matplotlib.pyplot as plt from numpy import *
2.陣列建立numpy
有幾種初始化numpy陣列的方法,例如:使用Python的list或tuple。使用旨在建立Numpy陣列的函式,如arrange、linspace等。從檔案中讀取資料(例如Python pickle格式)
2.1根據列表建立numpy.array
v = array([1,2,3,4]) v
M = array([[1,2],[3,4]]) M
v和M 都是ndarray型別的物件,由numpy模組建立。
type(v),type(M)
v陣列和M陣列的區別在於它們的尺寸(形式)。我們可以使用ndarray.shape屬性來獲取大小資訊。
v.shape
M.shape
矩陣中元素的數量可以通過屬性ndarray.size
M.size
也可以使用numpy方法numpy.shape
和numpy.size
shape(M)
size(M)
numpy.ndarray 看起來像一個普通的 Python 列表。使用它們而不是Python列表有幾個原因。
Python的列表是非常常見的。它們可以包含任何物件。他們是動態型別化的。它們不支援矩陣和詩詞作品等數學運算。由於動態型別的原因,在Python中用list實現這種操作並不是很有效。
Numpy陣列是靜態型別化和同質化的。元素型別是在建立陣列時定義的(那麼陣列資料型別可以改變)。
Numpy陣列不是很耗費記憶體。
得益於靜態型別化,數學函式如乘積和numpy陣列的和可以在編譯語言中實現(使用C和Fortran)。
使用ndarray陣列的dtype(資料型別)屬性,我們可以看到陣列的資料型別。
M.dtype
試圖分配一個錯誤型別(不一樣的型別)的值會導致錯誤。
M[0,0] = "hello"
建立陣列時,可以分別指定資料型別。
M = array([[1,4]],dtype=complex) M
通常使用以下dtype值:int、float、complex、bool、object等。
我們也可以用位元來指定大小:int64、int16、float128、complex128。
3.使用函式生成陣列
使用python列表來指定大型陣列是不切實際的。你可以使用各種Numpy方法。
3.1arrange
x = arange(0,10,1) # arguments: start,stop,step x
x = arange(-1,1,0.1) x
3.2linspace 和logspace
使用linspace,區間的兩端都被包括在內,引數:(開始,停止,點的數量)
linspace(0,25)
logspace(0,base=e)
3.3mgrid
x,y = mgrid[0:5,0:5] x y
3.4隨機數
#匯入所需模組 from numpy import random
#區間[0,1]內的均勻分佈數。 random.rand(5,5)
#來自於正態分佈的隨機數 random.randn(5,5)
3.6diag
#對角矩陣 diag([1,3])
#偏移對角矩陣 diag([1,3],k=1)
3.5零和單位矩陣
zeros((3,3))
ones((3,3))
4.檔案匯入和匯出
4.1逗號分隔的值(CSV)
一個非常常見的資料儲存格式是CSV,以及類似的格式,如TSV(製表分隔值)。要從這些檔案中讀取資料,你可以使用以下方法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我們可以將陣列儲存在CSV中。
M = random.rand(3,3) M
savetxt("random-matrix.csv",M) savetxt("random-matrix.csv",M,fmt='%.5f') # fmt 指定格式
4.2numpy陣列的主要檔案格式。
儲存和讀取的方法numpy.save
和numpy.load
save("random-matrix.npy",M) load("random-matrix.npy")
4.3numpy陣列的其他屬性
M.itemsize#每個byte中的單元數
M.nbytes#byte數目
M.ndim#單位數,計數
5.使用陣列
5.1編制索引
你可以使用方括號和索引來選擇陣列的元素。
# v是一個只有一個維度的向量,所以一個索引就足以獲得元素。 v[0]
# M是一個矩陣(二維陣列),所以需要兩個索引(行,列)。 M[1,1]
如果我們省略了多維陣列中的索引,就會返回一些值(一般情況下,N-1維的陣列)。
M
M[1]
M[1,:]#第一行
M[:,1]#第一列
使用索引,你可以為單個數組元素賦值。
M[0,0] = 1 M
也適用於行和列
#也適用於行和列 M[1,:] = 0 M[:,2] = -1 M
5.2選擇陣列的一部分
你可以使用M[lower:uperior:step]語法來獲取一個數組的一部分。
A = array([1,4,5]) A
A[1:3]
陣列的部分是可變的:如果給它們分配新的值,那麼從它們提取的陣列就會改變原來的陣列。
A[1:3] = [-2,-3] A
我們可以省略M[lower:upper:step]中的部分引數。
A[::]#下限、上限、預設步數
低於零的指數從陣列的末端開始計算。
A = array([1,5]) A[-1]#最後一個元素 A[-3:]#最後三個元素
索引分割槽也適用於多維陣列。
A = array([[n+m*10 for n in range(5)] for m in range(5)]) A
#方陣 A[1:4,1:4]
#漸進,帶有指定間隔數 A[::2,::2]
5.3先進的索引方法
陣列的值可以作為選擇專案的索引。
row_indices = [1,3] A[row_indices]
col_indices = [1,-1] A[row_indices,col_indices]
你也可以使用掩碼:如果掩碼型別為bool,那麼根據掩碼元素的值與相應的索引,選擇該元素(True)或不選擇(False)。
B = array([n for n in range(5)]) B
row_mask = array([True,False,True,False]) B[row_mask]
row_mask = array([1,0],dtype=bool) B[row_mask]
這個函式對於根據某些條件從陣列中選擇元素非常有用。
x = arange(0,0.5) x
mask = (5 < x) * (x < 7.5) mask
x[mask]
5.4從陣列中提取資料和建立陣列的函式。
5.4.1where
索引掩碼可以通過使用以下方法轉換為位置索引 where
indices = where(mask) indices
x[indices]#這個索引相當於x[mask]的索引。
5.4.2diag
使用diag函式還可以提取對角線和子對角線元素。
diag(A)
diag(A,-1)
5.4.3take
類似於上述的索引方法。
v2 = arange(-3,3) v2
row_indices = [1,5] v2[row_indices]
v2.take(row_indices)
但take也可以在列表和其他物件上工作。
take([-3,-2,-1,row_indices)
5.4.4choose
從多個數組中提取數值。
which = [1,0] choices = [[-2,-2],[5,5,5]] choose(which,choices) # 0th elem of 0 array,1st elem of 1 array,...
6.線性代數
6.1點積運算
v1 = arange(0,5) v1 * 2
v1 + 2
A * 2
A + 2
6.2基礎運算
A * A
v1 * v1
A.shape,v1.shape
A * v1
7.矩陣
7.1矩陣
dot(A,A)
dot(A,v1)
dot(v1,v1)
也可以將陣列轉換為矩陣的型別。然後再根據矩陣代數的規律進行+、-、*的算術運算。
M = matrix(A) v = matrix(v1).T#換位 v
M * M
M * v
v.T * v
v + M*v
8.資料處理
shape(data)
8.1平均值
#溫度柱 mean(data[:,3])
過去200年,斯德哥爾摩的平均氣溫在6.2攝氏度左右。
8.2標準差和離散度
std(data[:,3]),var(data[:,3])
8.3sum,prod,и trace
d = arange(0,10) d
#求和 sum(d)
#所有元素的乘積 prod(d+1) #累計總和 cumsum(d)
#累積乘積 cumprod(d+1) #和diag(A).sum()一樣 trace(A)
8.4多變數資料
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沒有改變,因為B是A的副本,不是同一個物件的引用。 A
10.增加一個新的度量newaxis
v = array([1,3]) shape(v)
#向量 -> 單列矩陣 v[:,newaxis]
#尺寸 v[:,newaxis].shape
v[newaxis,:].shape
11.聯合
b = array([[5,6]]) a = array([[5,6]]) concatenate((a,b),axis=0)
concatenate((a,axis=1)
12.hstack and vstack
vstack((a,b))
hstack((a,b))
13.Copy и "deep copy"
A = array([[1,4]]) A
#B等同於A B = A #改變B,將影響A B[0,0] = 10 B
A
B = copy(A) #現在改變B將不再影響A B[0,0] = -5 B
A
14.矩陣的迴圈
v = array([1,4]) for element in v: print(element)
M = array([[1,4]]) for row in M: print("row",row) for element in row: print(element)
通過列舉,可以同時獲得元素的值和索引。
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
#每個元素現在都是列表 M
到此這篇關於Numpy 多維資料陣列的實現的文章就介紹到這了,更多相關Numpy 多維資料陣列內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!