熱線電話:13121318867

登錄
首頁精彩閱讀Python中的線性代數運算
Python中的線性代數運算
2017-05-09
收藏

Python中的線性代數運算

這里,為了熟悉Python語言的特性,我們采用一種最原始的方式去定義線性代數運算的相關函數。如果是真實應用場景,則直接使用NumPy的函數即可。

1.向量
創建一個向量
我們可以把Python中的向量理解為有限維空間中的點。
height_weight_age = [70,170,40]
grades = [95,80,75,62]
向量運算
#### 加法定義——兩個向量
def vector_add(v,w):
    """add coresponding elements"""
    return [v_i + w_i
                for v_i,w_i in zip(v,w)]
#### 減法定義
def vector_substract(v,w):
    """substracts coresponding elements"""
    return [v_i - w_i
                   for v_i,w_i in zip(v,w)]
#### 向量加法——多個向量(list of vectors)
####### method 1:
def vector_sum(vectors):
    """sums of all coresponding elements"""
    result = vectors[0]
    for vector in vectors[1:]:
        result = vector_add(result,vector)
    return result
######## mothod 2:
def vector_sum(vecotrs):
    return reduce(vector_add,vectors)
######## mothod 3:
from functools import partial
vector_sum = partial(reduce,vector_add)
### 向量的數乘運算
def scalar_multiply(c,v):
    """c is a number,v is a vector"""
    return [c * v_i for v_i in v]
### 向量的均值運算
def vector_mean(vectors):
    """compute the vector whose i-th element is the mean of
    the i-th elements of the input vectors"""
    n = len(vecotrs)
    return scalar_multiply(1/n,vector_sum())
### 向量的點乘
def dot(v,w):
    return sum(v_i * w_i
                      for v_i,w_i in zip(v,w))
### 向量的平房和
def sum_of_squares(v):
    """v_1*v_1+v_2*v_2+...+v_n*v_n"""
    return dot(v,v)
### 向量的模
import math
def magnitude(v):
    return math.sqrt(sum_of_squares(v))
### 向量的距離
##### method 1:
def squared_distance(v,w):
    """"""
    return sum_of_squares(vector_substract(v,w))
##### method 2:
def distance(v,w):
    return magnitude(vector_substract(v,w))
##### method 3:
def distance(v,w):
    return math.sqrt(squared_distance(v,w))
2.矩陣
矩陣是一個二維的數字集合。我們可以通過列表的列表來表達一個矩陣,這樣,內層列表是等長的,并且每個內層列表表達矩陣的一行。
### 定義一個向量
A = [[1,2,3],
     [4,5,6]]

B = [[1,2],
     [3,4],
    [7,8]]

### 獲得矩陣的行數和列數
def shape(A):
    num_rows = len(A)
    num_cols = len(A[0]) if A else 0
    return num_rows,num_cols

### 提取某一行
def get_row(A,i):
    return A[i]

###提取某一列
def get_column(A,j):
    return [A_i[j]  # j-th element of row A_i
                   for A_i in A]  # for each row in A

### 定制特殊矩陣生成函數:如單位矩陣
def make_matrix(num_rows,num_cols,entry_fn):
    """return a matrix whose (i,j)-th entry is entry_fn(i,j)"""
    return [[entry_fn(i,j)
                    for j in range(num_cols)]
                           for i in range(num_rows)]
###
def is_diagonal(i,j):
    return 1 if i==j else 0
make_matrix(5,5,is_diagonal)
[[1, 0, 0, 0, 0],
 [0, 1, 0, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 0, 0, 1, 0],
 [0, 0, 0, 0, 1]]

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢