不使用numpy完成对矩阵的操作

不使用numpy完成对矩阵的操作

​ 众所周知,矩阵操作是进行数据分析的必要操作,而一般进行numpy便能对矩阵进行轻松操作。这里我尝试使用python手动编写对矩阵的操作。

矩阵输出

def print_matrix(A,lable=''):
    if lable=='':
        pass
    else:
        print(lable+"=")
    print('[',end='')
    sum=0
    for i in A:
        print('[',end='')
        count=0
        for j in i:
            count+=1
            if count == len(i):
                print(" %2.2f " %j,end='')
            else:
                print(" %2.2f ,"%j, end='')
        sum+=1
        if sum==len(A ):
            print(']',end='')
            print(']')
        else:
            print(']')

零矩阵生成

def zeros(x,y=''):
    if y=='':
        return [[0] * x for i in range(x)]
    return [[0] * x for i in range(y)]

对角矩阵

def  identity_matrix(n):
    list =zeros(n)
    for i in range(0,n):
        for j in range(0,n):
            if(i==j):
                list[i][j]=1
    return list

交换矩阵两行

def swap_rows(M, src, dest):
    M[src],M[dest] = M[dest],M[src]
    pass

将矩阵某行乘某值

def mult_row_scalar(M, row, scalar):
    for i in range(len(M[row])):
        M[row][i]=M[row][i]*scalar
    pass

将矩阵某行加上某行

def add_row_into(M, src, dest):
    for i in range(len(M[dest])):
        M[dest][i] = M[dest][i]+M[src][i]
    pass

两个矩阵相加

def add_matrices(A, B):
    assert len(A[0]) == len(B[0]), 'error'
    assert  len(A)==len(B) ,  'error'
    for i in range(len(A)):
        for j in range(len(A[i])):
            A[i][j]=A[i][j]+B[i][j]
    return A

两个矩阵相减

def sub_matrices(A, B):
    assert len(A[0]) == len(B[0]), 'error'
    assert len(A) == len(B), 'error'
    for i in range(len(A)):
        for j in range(len(A[i])):
            A[i][j]=A[i][j]-B[i][j]
    return A

矩阵乘法

def mult_scalar(M, s):
    for i in range(len(M)):
        for j in range(len(M[i])):
            M[i][j]=M[i][j]*s
    return M

矩阵点积

def dot_product(M, N):
    c = []
    for i in range(0, len(M)):
        temp = []
        for j in range(0, len(N[0])):
            s = 0
            for k in range(0, len(M[0])):
                s += M[i][k] * N[k][j]
            temp.append(s)
        c.append(temp)
    return c

取矩阵的任意行列

def create_sub_matrix1(M, exclude_row,exclude_col ):
    A=M.copy()
    del A[exclude_row]
    print_matrix(A)
    for i in range(len(A)):
        if(exclude_col==len(M[i])):
            del A[i][exclude_col]
            break
        else:
            for j in range(exclude_col,len(M[i])-1):
                A[i][j]=A[i][j+1]
    l=[]
    for i in range(0, len(M)-1):
        temp = []
        for j in range(0, len(M[0])-1):
            s = 0
            s=A[i][j]
            temp.append(s)
        l.append(temp)
    return l

矩阵行列式

def determinant1(matrix, mul=1):
    width = len(matrix)
    if width == 1:
        return mul * matrix[0][0]
    else:
        sign = -1
        sum = 0
        for i in range(width):
            m = []
            for j in range(1, width):
                buff = []
                for k in range(width):
                    if k != i:
                        buff.append(matrix[j][k])
                m.append(buff)
            sign *= -1
            sum += mul * determinant1(m, sign * matrix[0][i])
        return sum
def determinant(matrix):
    return determinant1(matrix,1)

矩阵余子式

def matrix_of_minors(M):
    list=[[0] * len(M)] * len(M[0])
    for i in range(len(M)):
        for j in range(len(M[0])):
            A=create_sub_matrix(M,i,j)
            d=determinant(A)
            list[i][j]+=d
    return list

单位矩阵

def identity(M):
    row=len(M)
    column=len(M[0])
    assert row == column, "Non n by n matrix, no identity matrix"
    for r in range(row):
      for c in range(column):
        M[r][ c] = 1.0 if r == c else 0.0
    return M

逆矩阵

def submatrix(A,i,j):
    p=len(A)
    q=len(A[0])
    C=[[A[x][y] for y in range(q) if y!=j] for x in range(p) if x!=i]
    return C
def det(A):
    p=len(A)
    q=len(A[0])
    if(p==1 and q==1):
        return A[0][0]
    else:
        value=0
        for j in range(q):
            value+=((-1)**(j+2))*A[0][j]*det(submatrix(A,0,j))
        return value
import copy
def inverse_matrix(M):
    p = len(A)
    q = len(A[0])
    C = copy.deepcopy(A)
    d = det(A)
    print(d)
    for i in range(p):
        for j in range(q):
            C[i][j] = ((-1) ** (i + j + 2)) * det(submatrix(A, j, i))
            C[i][j] = C[i][j] / d
    return C

总结

练习了对矩阵的操作,加深了对矩阵的理解同时也回顾了线性代数的知识。希望对大家有帮助。

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用numpy中的`numpy.vstack`或`numpy.hstack`函数将多个向量合并为矩阵。 例如: ``` import numpy as np vector1 = np.array([1, 2, 3]) vector2 = np.array([4, 5, 6]) vector3 = np.array([7, 8, 9]) vector4 = np.array([10, 11, 12]) matrix = np.vstack((vector1, vector2, vector3, vector4)) print(matrix) ``` 输出: ``` array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]]) ``` ### 回答2: 使用numpy将四个向量合并存储为矩阵非常简单。首先,我们需要导入numpy库。 import numpy as np 然后,我们可以创建四个向量,分别为vec1、vec2、vec3和vec4。这里假设每个向量的维度都为n。 vec1 = np.array([1, 2, 3, 4]) vec2 = np.array([5, 6, 7, 8]) vec3 = np.array([9, 10, 11, 12]) vec4 = np.array([13, 14, 15, 16]) 接下来,我们可以使用numpy库中的vstack函数来垂直(按行)合并这四个向量,形成一个矩阵。vstack函数接受一个元组或列表作为输入,将其按行合并。 matrix = np.vstack((vec1, vec2, vec3, vec4)) 最后,我们可以打印输出矩阵。 print(matrix) 这样就能将四个向量合并存储为矩阵了。输出结果将类似于: [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]] ### 回答3: 使用numpy可以很方便地将四个向量合并存储为矩阵。具体步骤如下: 首先,我们需要导入numpy库: import numpy as np 然后,我们创建四个向量(或二维数组): vector1 = np.array([1, 2, 3, 4]) vector2 = np.array([5, 6, 7, 8]) vector3 = np.array([9, 10, 11, 12]) vector4 = np.array([13, 14, 15, 16]) 接下来,我们将四个向量合并为矩阵,可以使用numpy中的concatenate函数: matrix = np.concatenate((vector1, vector2, vector3, vector4)) 完成以上操作后,我们得到了一个一维矩阵matrix,其中包含了四个向量的所有元素。 如果我们要将这个一维矩阵转换为二维矩阵,可以使用reshape函数: matrix = matrix.reshape((4, 4)) 这样,我们就成功地将四个向量合并存储为一个4x4的矩阵matrix。 最后,我们可以打印出这个矩阵来进行验证: print(matrix) 输出结果为: [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]] 通过以上步骤,我们成功地将四个向量合并存储为了一个4x4的矩阵
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值