Educoder python NumPy数组的高级操作 第5关:线性代数

题目链接:https://www.educoder.net/tasks/smf3gzjp89fw

 


任务描述

本关任务:编写一个能求解线性方程的函数。

相关知识

为了完成本关任务,你需要掌握:1.如何使用numpy进行矩阵运算;2.点积和matmul的区别。

numpy的线性代数

线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分,一般我们使用*对两个二维数组相乘得到的是一个元素级的积,而不是一个矩阵点积。因此numpy提供了线性代数函数库linalg,该库包含了线性代数所需的所有功能。

常用的numpy.linalg函数:

函数 说明
dot 矩阵乘法
vdot 两个向量的点积
det 计算矩阵的行列式
inv 计算方阵的逆
svd 计算奇异值分解(SVD)
solve 解线性方程组 Ax=b,A是一个方阵
matmul 两个数组的矩阵积

常用函数

dot():该函数返回俩个数组的点积。对于二维向量,效果等于矩阵乘法;对于一维数组,它是向量的内积;对于N维数组,它是a的最后一个轴上的和与b的倒数第二个轴的乘积。


 
  1. a=np.array([[1,2],[3,4]])
  2.  
  3. a1=np.array([[5,6],[7,8]])
  4.  
  5. np.dot(a,a1)
  6. '''
  7. 输出:array([[19, 22],
  8. [43, 50]])
  9. '''

det():该函数用于计算输入矩阵的行列式。


 
  1. a = np.array([[14, 1], [6, 2]])
  2.  
  3. a=linalg.det(a)
  4.  
  5. print(a)
  6. '''
  7. 输出:21.999999999999996
  8. '''

inv():该函数用于计算方阵的逆矩阵。逆矩阵的定义维如果两个方阵AB,使得AB = BA = E,则A称为可逆矩阵,BA的逆矩阵,E为单位矩阵。


 
  1. a=np.array([[1,2],[3,4]])
  2.  
  3. b=linalg.inv(a)
  4.  
  5. print(np.dot(a,b))
  6. '''
  7. 输出:array([[1.0000000e+00, 0.0000000e+00],
  8. [8.8817842e-16, 1.0000000e+00]])
  9. '''

solve():该函数用于计算线性方程的解。

假设有如下方程组:3x+2y=7 x+4y=14

写成矩阵的形式:[[3,2][1,4]]*[[x],[y]]=[[7],[14]]

解如上方程组代码如下:


 
  1. a=np.array([[3,2], [1,4]])
  2.  
  3. b=np.array([[7],[14]])
  4.  
  5. linalg.solve(a,b)
  6. '''
  7. 输出:array([[0. ],
  8. [3.5]])
  9. 最后解出x=0,y=3.5
  10. '''

matmul():函数返回两个数组的矩阵乘积。如果参数中有一维数组,则通过在其维度上附加1来提升为矩阵,并在乘法之后去除。


 
  1. a=[[3,4],[5,6]]
  2.  
  3. b=[[7,8],[9,10]]
  4.  
  5. np.matmul(a,b)
  6. '''
  7. 输出:array([[ 57, 64],
  8. [ 89, 100]])
  9. '''
  10.  
  11. b=[7,8]
  12.  
  13. np.matmul(a,b)
  14. '''
  15. 输出:array([53, 83])
  16. '''

svd():奇异值分解是一种矩阵分解的方法,该函数用来求解SVD


 
  1. a=[[0,1],[1,1],[1,0]]
  2.  
  3. linalg.svd(a)
  4.  
  5. '''
  6. 输出:(array([[-4.08248290e-01, 7.07106781e-01, 5.77350269e-01],
  7. [-8.16496581e-01, 2.64811510e-17, -5.77350269e-01],
  8. [-4.08248290e-01, -7.07106781e-01, 5.77350269e-01]]), array([1.73205081, 1. ]), array([[-0.70710678, -0.70710678],
  9. [-0.70710678, 0.70710678]]))
  10. '''

编程要求

请在右侧编辑器Begin-End处补充代码,计算性别为男的线性方程解,前两个数为方程左边,最后一个数为方程右边。

  • 具体要求请参见后续测试样例。

请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

测试输入:

[["男",2,4,40],["女",8,3,17],["男",8,6,24]]

预期输出:


 
  1. [[-7.2]
  2. [13.6]]

提示:测试数据的方程为2x+4y=408x+6y=24


开始你的任务吧,祝你成功!

from numpy import linalg
import numpy as np
def student(input_data):
    '''
    将输入数据筛选性别为男,再进行线性方程求解
    :param input_data:类型为`list`的输入数据
    :return:类型为`ndarray`
    '''
    result=[]
    # ********* Begin *********#
    a = np.array(input_data)
    x=[]
    y=[]
    for i in a:
        if i[0]=="男":
            x.append([int(i[1]),int(i[2])])
            y.append([int(i[-1])])
    if x==[] and y==[]:
        return result
    x=np.array(x)
    y=np.array(y)
    result=linalg.solve(x,y)
    # ********* End *********#
    return result

 

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值