1. 程式人生 > 程式設計 >Numpy 多維資料陣列的實現

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


Numpy 多維資料陣列的實現

M = array([[1,2],[3,4]])
M

Numpy 多維資料陣列的實現

v和M 都是ndarray型別的物件,由numpy模組建立。

type(v),type(M)

Numpy 多維資料陣列的實現

v陣列和M陣列的區別在於它們的尺寸(形式)。我們可以使用ndarray.shape屬性來獲取大小資訊。

v.shape

Numpy 多維資料陣列的實現

M.shape

Numpy 多維資料陣列的實現

矩陣中元素的數量可以通過屬性ndarray.size

M.size

Numpy 多維資料陣列的實現

也可以使用numpy方法numpy.shapenumpy.size

shape(M)

Numpy 多維資料陣列的實現

size(M)

Numpy 多維資料陣列的實現

numpy.ndarray 看起來像一個普通的 Python 列表。使用它們而不是Python列表有幾個原因。

Python的列表是非常常見的。它們可以包含任何物件。他們是動態型別化的。它們不支援矩陣和詩詞作品等數學運算。由於動態型別的原因,在Python中用list實現這種操作並不是很有效。
Numpy陣列是靜態型別化和同質化的。元素型別是在建立陣列時定義的(那麼陣列資料型別可以改變)。
Numpy陣列不是很耗費記憶體。
得益於靜態型別化,數學函式如乘積和numpy陣列的和可以在編譯語言中實現(使用C和Fortran)。
使用ndarray陣列的dtype(資料型別)屬性,我們可以看到陣列的資料型別。

M.dtype

Numpy 多維資料陣列的實現

試圖分配一個錯誤型別(不一樣的型別)的值會導致錯誤。

M[0,0] = "hello"

Numpy 多維資料陣列的實現

建立陣列時,可以分別指定資料型別。

M = array([[1,4]],dtype=complex)
M

Numpy 多維資料陣列的實現

通常使用以下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

Numpy 多維資料陣列的實現

x = arange(-1,1,0.1)
x

Numpy 多維資料陣列的實現

3.2linspace 和logspace

使用linspace,區間的兩端都被包括在內,引數:(開始,停止,點的數量)

linspace(0,25)

Numpy 多維資料陣列的實現

logspace(0,base=e)

Numpy 多維資料陣列的實現

3.3mgrid

x,y = mgrid[0:5,0:5]
x
y

Numpy 多維資料陣列的實現Numpy 多維資料陣列的實現

3.4隨機數

#匯入所需模組
from numpy import random
#區間[0,1]內的均勻分佈數。
random.rand(5,5)

Numpy 多維資料陣列的實現

#來自於正態分佈的隨機數
random.randn(5,5)

Numpy 多維資料陣列的實現

3.6diag

#對角矩陣
diag([1,3])

Numpy 多維資料陣列的實現

#偏移對角矩陣
diag([1,3],k=1)

Numpy 多維資料陣列的實現

3.5零和單位矩陣

zeros((3,3))

Numpy 多維資料陣列的實現

ones((3,3))

Numpy 多維資料陣列的實現

4.檔案匯入和匯出

4.1逗號分隔的值(CSV)

一個非常常見的資料儲存格式是CSV,以及類似的格式,如TSV(製表分隔值)。要從這些檔案中讀取資料,你可以使用以下方法numpy.genfromtxt

data = genfromtxt('stockholm_td_adj.dat')
data.shape

Numpy 多維資料陣列的實現

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 多維資料陣列的實現

使用numpy.savetxt我們可以將陣列儲存在CSV中。

M = random.rand(3,3)
M

Numpy 多維資料陣列的實現

savetxt("random-matrix.csv",M)
savetxt("random-matrix.csv",M,fmt='%.5f') # fmt 指定格式

4.2numpy陣列的主要檔案格式。

儲存和讀取的方法numpy.savenumpy.load

save("random-matrix.npy",M)
load("random-matrix.npy")

Numpy 多維資料陣列的實現

4.3numpy陣列的其他屬性

M.itemsize#每個byte中的單元數
M.nbytes#byte數目
M.ndim#單位數,計數

5.使用陣列

5.1編制索引

你可以使用方括號和索引來選擇陣列的元素。

# v是一個只有一個維度的向量,所以一個索引就足以獲得元素。
v[0]

Numpy 多維資料陣列的實現

# M是一個矩陣(二維陣列),所以需要兩個索引(行,列)。
M[1,1]

Numpy 多維資料陣列的實現

如果我們省略了多維陣列中的索引,就會返回一些值(一般情況下,N-1維的陣列)。

M

Numpy 多維資料陣列的實現

M[1]

Numpy 多維資料陣列的實現

M[1,:]#第一行

Numpy 多維資料陣列的實現

M[:,1]#第一列

Numpy 多維資料陣列的實現

使用索引,你可以為單個數組元素賦值。

M[0,0] = 1
M

也適用於行和列

#也適用於行和列
M[1,:] = 0
M[:,2] = -1
M

Numpy 多維資料陣列的實現

5.2選擇陣列的一部分

你可以使用M[lower:uperior:step]語法來獲取一個數組的一部分。

A = array([1,4,5])
A

Numpy 多維資料陣列的實現

A[1:3]

Numpy 多維資料陣列的實現

陣列的部分是可變的:如果給它們分配新的值,那麼從它們提取的陣列就會改變原來的陣列。

A[1:3] = [-2,-3]
A

Numpy 多維資料陣列的實現

我們可以省略M[lower:upper:step]中的部分引數。

A[::]#下限、上限、預設步數

Numpy 多維資料陣列的實現

低於零的指數從陣列的末端開始計算。

A = array([1,5])
A[-1]#最後一個元素
A[-3:]#最後三個元素

索引分割槽也適用於多維陣列。

A = array([[n+m*10 for n in range(5)] for m in range(5)]) 
A

Numpy 多維資料陣列的實現

#方陣
A[1:4,1:4]

Numpy 多維資料陣列的實現

#漸進,帶有指定間隔數
A[::2,::2]

Numpy 多維資料陣列的實現

5.3先進的索引方法

陣列的值可以作為選擇專案的索引。

row_indices = [1,3]
A[row_indices]

Numpy 多維資料陣列的實現

col_indices = [1,-1]
A[row_indices,col_indices]

Numpy 多維資料陣列的實現

你也可以使用掩碼:如果掩碼型別為bool,那麼根據掩碼元素的值與相應的索引,選擇該元素(True)或不選擇(False)。

B = array([n for n in range(5)])
B

Numpy 多維資料陣列的實現

row_mask = array([True,False,True,False])
B[row_mask]

Numpy 多維資料陣列的實現

row_mask = array([1,0],dtype=bool)
B[row_mask]

Numpy 多維資料陣列的實現

這個函式對於根據某些條件從陣列中選擇元素非常有用。

x = arange(0,0.5)
x

Numpy 多維資料陣列的實現

mask = (5 < x) * (x < 7.5)
mask

Numpy 多維資料陣列的實現

x[mask]

Numpy 多維資料陣列的實現

5.4從陣列中提取資料和建立陣列的函式。

5.4.1where

索引掩碼可以通過使用以下方法轉換為位置索引 where

indices = where(mask)
indices

Numpy 多維資料陣列的實現

x[indices]#這個索引相當於x[mask]的索引。

Numpy 多維資料陣列的實現

5.4.2diag

使用diag函式還可以提取對角線和子對角線元素。

diag(A)

Numpy 多維資料陣列的實現

diag(A,-1)

Numpy 多維資料陣列的實現

5.4.3take

類似於上述的索引方法。

v2 = arange(-3,3)
v2

Numpy 多維資料陣列的實現

row_indices = [1,5]
v2[row_indices]

Numpy 多維資料陣列的實現

v2.take(row_indices)

Numpy 多維資料陣列的實現

但take也可以在列表和其他物件上工作。

take([-3,-2,-1,row_indices)

Numpy 多維資料陣列的實現

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,...

Numpy 多維資料陣列的實現

6.線性代數

6.1點積運算

v1 = arange(0,5)
v1 * 2

Numpy 多維資料陣列的實現

v1 + 2

Numpy 多維資料陣列的實現

A * 2

Numpy 多維資料陣列的實現

A + 2

Numpy 多維資料陣列的實現

6.2基礎運算

A * A

Numpy 多維資料陣列的實現

v1 * v1

Numpy 多維資料陣列的實現

A.shape,v1.shape

Numpy 多維資料陣列的實現

A * v1

Numpy 多維資料陣列的實現

7.矩陣

7.1矩陣

dot(A,A)

Numpy 多維資料陣列的實現

dot(A,v1)

Numpy 多維資料陣列的實現

dot(v1,v1)

Numpy 多維資料陣列的實現

也可以將陣列轉換為矩陣的型別。然後再根據矩陣代數的規律進行+、-、*的算術運算。

M = matrix(A)
v = matrix(v1).T#換位
v

Numpy 多維資料陣列的實現

M * M

Numpy 多維資料陣列的實現

M * v

Numpy 多維資料陣列的實現

v.T * v

Numpy 多維資料陣列的實現

v + M*v

Numpy 多維資料陣列的實現

8.資料處理

shape(data)

Numpy 多維資料陣列的實現

8.1平均值

#溫度柱
mean(data[:,3])

Numpy 多維資料陣列的實現

過去200年,斯德哥爾摩的平均氣溫在6.2攝氏度左右。

8.2標準差和離散度

std(data[:,3]),var(data[:,3])

Numpy 多維資料陣列的實現

8.3sum,prod,и trace

d = arange(0,10)
d

Numpy 多維資料陣列的實現

#求和
sum(d)

Numpy 多維資料陣列的實現

#所有元素的乘積
prod(d+1)
#累計總和
cumsum(d)

Numpy 多維資料陣列的實現

#累積乘積
cumprod(d+1)
#和diag(A).sum()一樣
trace(A)

Numpy 多維資料陣列的實現

8.4多變數資料

m = random.rand(3,3)
m

Numpy 多維資料陣列的實現

m.max()

Numpy 多維資料陣列的實現

#每列最大值 
m.max(axis=0)

Numpy 多維資料陣列的實現

#每行最大值 
m.max(axis=1)

Numpy 多維資料陣列的實現

9.改變陣列的形狀和大小

A

Numpy 多維資料陣列的實現

n,m = A.shape
B = A.reshape((1,n*m))
B

Numpy 多維資料陣列的實現

B[0,0:5] = 5
B

Numpy 多維資料陣列的實現

A 

Numpy 多維資料陣列的實現

B = A.flatten()
B

Numpy 多維資料陣列的實現

B[0:5] = 10
B

Numpy 多維資料陣列的實現

#A沒有改變,因為B是A的副本,不是同一個物件的引用。
A

Numpy 多維資料陣列的實現

10.增加一個新的度量newaxis

v = array([1,3])
shape(v)

Numpy 多維資料陣列的實現

#向量 -> 單列矩陣
v[:,newaxis]

Numpy 多維資料陣列的實現

#尺寸
v[:,newaxis].shape

Numpy 多維資料陣列的實現

v[newaxis,:].shape

Numpy 多維資料陣列的實現

11.聯合

b = array([[5,6]])
a = array([[5,6]])
concatenate((a,b),axis=0)

Numpy 多維資料陣列的實現

concatenate((a,axis=1)

Numpy 多維資料陣列的實現

12.hstack and vstack

vstack((a,b))

Numpy 多維資料陣列的實現

hstack((a,b))

Numpy 多維資料陣列的實現

13.Copy и "deep copy"

A = array([[1,4]])
A

Numpy 多維資料陣列的實現

#B等同於A
B = A 
#改變B,將影響A
B[0,0] = 10
 
B

Numpy 多維資料陣列的實現

A

Numpy 多維資料陣列的實現

B = copy(A)
#現在改變B將不再影響A
B[0,0] = -5
B

Numpy 多維資料陣列的實現

A

Numpy 多維資料陣列的實現

14.矩陣的迴圈

v = array([1,4])
 
for element in v:
  print(element)

Numpy 多維資料陣列的實現

M = array([[1,4]])
 
for row in M:
  print("row",row)
  
  for element in row:
    print(element)

Numpy 多維資料陣列的實現

通過列舉,可以同時獲得元素的值和索引。

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

Numpy 多維資料陣列的實現

#每個元素現在都是列表
M

Numpy 多維資料陣列的實現

到此這篇關於Numpy 多維資料陣列的實現的文章就介紹到這了,更多相關Numpy 多維資料陣列內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!