天天看點

python進階-- numpy基本功能

Numpy是用于科學計算的python包。

一、建立numpy數組(array)

A numpy array or ND array 與python資料結構中的清單(list)非常相似,不過numpy array一般大小固定,且其中每個元素的類型相同,比如都是整數型、都是浮點型。

建立numpy array時,需要先import numpy。numpy array的資料類型是numpy.ndarray.(不是list哦!)

(一)建立一維數組(array)

import numpy as np
a = np.array([0,1,2,3,4])
type(a)
#numpy.ndarray
a.dtype
#dtype('int32')
           
python進階-- numpy基本功能

如果array裡有一個元素是文字,則所有元素都會變成文字類型

python進階-- numpy基本功能

一些常用的查詢array屬性的方法:

  • a.dtype: 傳回array的資料類型
  • a.size:傳回array中元素的個數
  • a.shape:傳回每個次元下的元素個數,元組(tuple)形式
  • a.ndim:傳回array的次元,一維數組為1,二維數組為2, n維數組為n
a = np.array([0,1,2,3,4])
a.dtype  # dtype('int32')
a.size   # 5
a.shape  # (5,)
a.ndim   # 1
           

(二)建立多元數組(array)

#二維數組
a = [[1,2,3],[4,5,6],[7,8,9]]
A = np.array(a)
# A =  |1,2,3|
#      |4,5,6|
#      |7,8,9|
#A是一個二維數組。
A.ndim
# 2 
# 可以認為A.ndim表示有多少層括号
A.shape
#(3,3)
#A.shape反應了每層括号裡所包含的元素個數,即每個次元下的元素個數。
#比如A有3行(第一層括号有3個元素)和3列(每個第二層括号裡都有3個元素)
A.size
# 9
# A.size傳回整個數組的元素個數,比如A中一共有3*3=9個元素。
           
python進階-- numpy基本功能

二、index and slice

(一)一維數組index和slicing

1. Index和修改資料
python進階-- numpy基本功能
2. Slicing和修改資料

利用切片一次性修改多個資料的時候,新資料指派時不用加方括号!

python進階-- numpy基本功能
3. 用清單list選擇和修改array中元素的值

下圖中清單select給出了從array選擇的元素的index,c是被選擇的array, d是選擇後的array

python進階-- numpy基本功能

(二)二維數組(矩陣)index和slicing

1. Index

矩陣名[行數,列數] 或者 矩陣名[行數][列數]

#擷取下圖矩陣A的第二行、第三列資料
#注意行、列均從0開始編号
A[1,2]
#結果: 23
A[1][2]
#結果:23
           
python進階-- numpy基本功能
#擷取下圖矩陣A的第一行、第一列資料
#注意行、列均從0開始編号
A[0][0]
#結果: 11
           
python進階-- numpy基本功能
2. Slicing

矩陣名[行數範圍,列數範圍] 或者 矩陣名[行數範圍][列數範圍]

傳回值是array結構

#擷取矩陣A的第1行、第1-2列的資料
A[0][0:2]
#結果
#array([11, 12])
           
python進階-- numpy基本功能
#擷取矩陣A的第1-2行、第3列的資料
A[0:2][2]
#結果
#array([13, 23])
           
python進階-- numpy基本功能

注意:A[0:2][0:2] 與A[0:2,0:2]擷取的資料差別

A[0:2,0:2]
#結果
#array([[11, 12],
#       [21, 22]])
#擷取矩陣A的第1-2行、第1-2列的資料

A[0:2][0:2]
#結果
#array([[11, 12, 13],
#       [21, 22, 23]])
#相當于先擷取矩陣A的第1-2行資料(矩陣A_1),再擷取A'的第1-2行資料,即
#A_1 = A[0:2]
#A[0:2][0:2] = A_1[0:2]
           

如果想擷取矩陣A第1-2列資料的第2-3行資料:

#最直接
A[1:3,0:2]
#結果
#array([[21, 22],
#       [31, 32]])


#如果想行列拆開寫,先擷取第2-3行全部資料,然後從中擷取第1-2列的資料
A[1:3][:,0:2]
#結果
#array([[21, 22],
#       [31, 32]])


#或者,先擷取第1-2列全部資料,然後從中擷取第2-3行的資料
A[:,0:2][1:3]
#結果
#array([[21, 22],
#       [31, 32]])
           

三、基礎算法 - 一維數組(向量)

(一)向量(vector)加減

不使用numpy的時候,需要用loop将每對元素相加

#将兩個向量u和v相加,不使用numpy
u = [0,1]
v = [1,3]
z = []
for n, m in zip(u,v):
    z.append(n+m)
#【結果】
# z = [1,4]
           

如果使用numpy,計算速度會更快

#将兩個向量u和v相加,使用numpy
import numpy as np
u = np.array([0,1])
v = np.array([1,3])
z = u+v
#【結果】
# z = [1,4]
           

也可以進行向量減法、向量與常數相乘、向量與常數相加

z = u-v
#【結果】
# z = [-1,-2]

z1 = z*2
#【結果】
# z = [-2,-4]

z2 = z + 2
#【結果】
# z = [1,0]
           

還可以進行向量乘法(結果為一個向量)、向量點積(結果為一個數值)

u = [1,2]
v = [3,4]
z = u*v
#【結果】
# z = [1*3+1*4,2*3+2*4] = [7,14]

z1 = np.dot(u,v)
#【結果】
# z1 = 1*3+2*4 = 11
           

需要注意,向量乘法不滿足交換律,即u * v != v * u

z2 = v*u
#【結果】
# z2 = [3*1+3*2,4*1+4*2] = [9,12]
           

四、通用功能 - 一維數組

  • 最小值、最大值、标準差、平均值等,min(), max(), std(), mean()
a = np.array([1,-2,3,4])
#求平均
mean_a = a.mean()
# mean_a = (1-2+3+4)/4 = 1.5
#找最大值
max_a = a.max()
#max_a = 4
min_a = a.min()
#min_a = -2
std_a = a.std()
#std_a = 2.29128784747792
           
  • np.pi & .sin()
# np.pi是圓周率,求sin()
x = np.array([0, np.pi/2, np.pi])
y = np.sin(x)
#y = [sin(0), sin(np.pi/2), sin(np.pi)] = [0, 1, 0]
           
  • np.linespace(start point, end point, 元素個數):建立均勻分布的數列
x = np.linespace(-2, 2, num = 5)
#x = [-2, -1, 0, 1, 2]

y = np.linespace(-2, 2, num = 9)
#y = [-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2]

           

五、基礎算法–二維數組(矩陣)

1. 矩陣加法、與常量相乘、Hadamard乘積(按元素相乘)
  • 矩陣加法
x = np.array([[1,0],[0,1]])
y = np.array([[2,1],[1,2]])

z = x+y
# z: array([[3,1],[1,3]])
           
python進階-- numpy基本功能
  • 矩陣與常數相乘
z1 = 2*y
# z1: array([[4,2],[2,4]])
           
python進階-- numpy基本功能
  • 矩陣Hadamard乘積(即矩陣各元素相乘)
z2 = x*y
#z2: array([[1*2,0*1],[0*1,1*2]]) = array([[2,0],[0,2]])
           
python進階-- numpy基本功能
2. 矩陣乘法
x = np.array([[0,1,1],[1,0,1]])
y = np.array([[1,1],[1,1],[-1,1]])
#矩陣乘法的時候,需要保證前面矩陣的行數與後面矩陣的列數相等。
z = np.dot(x,y)
# z: array([[0*1+1*1+1*-1,0*1+1*1+1*1],[1*1+0*1+1*-1,1*1+0*1+1*1]]) ---> array([[0,2],[0,2]])
           
3. 矩陣轉置
C = np.array([[1,1],[2,2],[3,3]])
C
#array([[1, 1],
#       [2, 2],
#       [3, 3]])
C.T
#array([[1, 2, 3],
#       [1, 2, 3]])
           
4. 其他
  • np.sin() : 對矩陣中各個元素分别求sin值
Z = np.array([[0,2],[0,2]])
np.sin(Z)

#結果
#array([[0.        , 0.90929743],
#       [0.        , 0.90929743]])