技术标签: python 矩阵 机器学习 线性代数 numpy
N u m P y NumPy NumPy提供了线性代数函数库linalg
,该库包含了线性代数所需的所有功能,可以看看下面的说明。
函数 | 内容 |
---|---|
dot |
两数组的点积 |
vdot |
两向量的点积 |
inner |
两数组的内积 |
determinant |
数组的行列式 |
matmul |
两数组的矩阵积 |
inv |
求矩阵的逆 |
solve |
求解线性矩阵方程 |
numpy.dot()
:numpy.dot()
numpy.vdot
:numpy.vdot()
numpy.inner()
:numpy.inner()
numpy.determinant()
:numpy.determinant()
numpy.matmul()
:numpy.matmul()
numpy.inv()
:numpy.inv()
numpy.solve()
:numpy.solve()
numpy.matmul()
numpy.matmul()
函数返回两个数组的矩阵乘积:
matmul
与dot
的差异主要在两个方面:
*
代替matmul
操作的矩阵允许将最后两个索引的矩阵的栈广播它就是矩阵乘法:
import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[1,2],[3,4]])
ans=np.matmul(a,b)
print(ans)
[[ 7 10]
[15 22]]
计算公式:
1 × 1 + 2 × 3 1\times 1 + 2\times 3 1×1+2×3, 1 × 2 + 2 × 4 1\times 2 + 2\times 4 1×2+2×4
3 × 1 + 4 × 3 3\times 1 + 4\times 3 3×1+4×3, 3 × 2 + 4 × 4 3\times 2 + 4\times 4 3×2+4×4
a = [[1,2],[3,4]]
b = [1,2]
print (np.matmul(a,b)) #b被提升为(2,1)的矩阵 b=[[1],[2]] a*b=[[5],[11]],去掉为1的维度变成[5,11]
print (np.matmul(b,a)) #b被提升为(1,2)的矩阵 b=[[1,2]] a*b=[[7,10]],去掉为1的维度变成[7,10]
[ 5 11]
[ 7 10]
如果某一个参数是 n ( n > 2 ) ) n(n>2)) n(n>2))维的,该参数 n n n被看作一些矩阵(参数的最后两个维数为矩阵维数)的stack,而且计算时会相应的广播。
a = np.arange(2*3*4).reshape((2,3,4))
b = np.arange(2*4*3).reshape((2,4,3))
c = np.arange(1*3*4).reshape((1,4,3))
print("矩阵a:",'\n',a)
print("矩阵b:",'\n',b)
print("矩阵c:",'\n',c)
矩阵a:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
矩阵b:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]
矩阵c:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]]
a
多维数组,被当作两个 3 × 4 3\times 4 3×4矩阵。b
多维数组,被当作两个 4 × 3 4\times 3 4×3矩阵。c
多维数组,被当作一个 4 × 3 4\times 3 4×3矩阵np.matmul(a,b)
会将a
的第一个矩阵和b
的第一个矩阵相乘,将a
的第二个矩阵b
的第二个矩阵相乘,最终得到一个 2 × 3 × 3 2\times 3\times 3 2×3×3的矩阵。
ans=np.matmul(a,b)
print(ans)
[[[ 42 48 54]
[ 114 136 158]
[ 186 224 262]]
[[ 906 960 1014]
[1170 1240 1310]
[1434 1520 1606]]]
np.matmul(a,c)
中c
只有一个矩阵,所以它会广播一个矩阵(即复制一个原本c
矩阵后两维的矩阵),这样c
就变成了 2 × 4 × 3 2\times 4\times 3 2×4×3的矩阵,可以与a
相乘得到一个 2 × 3 × 3 2\times 3\times 3 2×3×3的矩阵。
ans=np.matmul(a,c)
print(ans)
[[[ 42 48 54]
[114 136 158]
[186 224 262]]
[[258 312 366]
[330 400 470]
[402 488 574]]]
乘一个标量是不被允许的,只能用*
代替。
a=np.array([1,2])
print(np.matmul(a, 3))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-23-9a91f367630a> in <module>
1 a=np.array([1,2])
----> 2 print(np.matmul(a, 3))
ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
print(a*3)
[3 6]
文章浏览阅读787次,点赞14次,收藏12次。计算机毕业设计中的商城实现是一个模拟电子商务平台的综合项目,它采用SSM(Spring、SpringMVC、MyBatis)技术栈进行开发,以实现一个功能完备的在线购物系统。Spring框架负责系统的业务逻辑和事务管理,确保数据的一致性和完整性;SpringMVC作为模型-视图-控制器的实现,处理用户的HTTP请求并渲染动态网页;MyBatis则作为持久层框架,与数据库进行交云,执行CRUD操作。该商城系统通常包括用户管理、商品展示、购物车、订单处理、支付系统集成、商品搜索和推荐、用户评论等功能。通过这个项
文章浏览阅读2.6w次,点赞24次,收藏106次。之前研究了一下RSA软件gpg,一直没弄明白,今天看了一篇博客,终于尝试成功了。转载自:http://blog.51cto.com/z00w00/2070169一、加密模式简述加密工具基于算法模式,一般分两类,一类是对称加密,一种是非对称加密。前者加密和解密使用一套密钥,常用于密码式加密;后者非对称加密,加密和解密使用两套密钥:一般为公钥加密,私钥解密。文件加密主要是为了安全,诚然..._kleopatra软件
文章浏览阅读8.4k次。准备软件及第三方模块:nginx-1.9.2.tar.gzngx_devel_kit-master.zip 随机数模块的依赖模块 --add时在前面(--add-module=../nginx_module/ngx_devel_kit-master--add-module=../nginx_module/set-misc-nginx-module-master)set-misc-n_set-misc-nginx-module-master
文章浏览阅读312次。今天这篇给自己解释了一下为什么 Linux veth0/1 + bridge ping 不通。原因都在 ip route show table local 输出里。直接上步骤:[dahui@192 ~]$ route -vKernel IP routing tableDestination Gateway Genmask Flags Metric Ref ..._local 192.168.1.2 dev veth1 proto kernel scope host src 192.168.1.2
文章浏览阅读370次。C/C++最大值最小值平均值第十一届青少组蓝桥杯C++选拔赛真题一、题目要求1、编程实现输入10个正整数,以空格分隔,输出其中的最大值、最小值以及平均值,以逗号隔开_蓝桥杯 c++ 最大价值
文章浏览阅读301次。模拟故障:说明:本故障处理必须在删除数据文件短时间内进行操作,长时间的话数据库会检测到checkpoint或切换日志然后数据库宕机。然后就无法恢复了。==================================查看当前用户下所有表的行数统计可以先create view tbnameas select table_name tbname from user_table_dbfos
文章浏览阅读700次。引言ARM处理器以其高性能、低功耗、低成本等优势被广泛应用于各种成功的32位嵌入式系统中。提高执行速度和减小代码尺寸是嵌入式软件设计的关键需求。尽管大多数的ARM编译器和调试器都带有性能优化工具,但是为了保证其正确性,编译器必须是稳妥和安全的,而且它还受到处理器自身结构的限制。因此,编程人员必须在理解编译器工作特点的基础上来实现代码优化。代码的优化方法较多,本文针对函数优化方法进行阐述。1 函数..._arm reset_handler可以用c语言实现吗
文章浏览阅读398次,点赞6次,收藏8次。太清宫 老子 太上老君 庙会
文章浏览阅读1.7w次,点赞4次,收藏21次。[更新日期:2019年04月22日,欢迎提出修改建议,不断更新。咨询邮件[email protected],请务必附件样例以及有问题脚本,出错提示等,否则不予回复]] 在语音研究过程中,整理语料,录音,再进行标注,是一个非常重要并且基础的步骤。在录音时比较高效的做法是让录音人一次把所有语料全部录制完成,而不是录一句保存一句。这样录出来的语音存在的问题是,在标注时,声音太长,会很难处..._praat切分
文章浏览阅读634次,点赞24次,收藏18次。目录前言构建一颗二叉树二叉树的遍历求一颗二叉树的结点个数前言由于二叉树是数据结构中偏难的一块,这里我们先熟悉二叉树的结构,再具体来实现一颗二叉树,采用手动构建二叉树的方式,帮助大家进一步理解构建一颗二叉树呈现的是一个树型结构BTNode *BinaryTreeCreate(char ch) { BTNode *newNode = (BTNode *)malloc(sizeof(BTNode)); newNode->data = ch; newNode->left = N._c语言假设二叉树采用二叉链表存储结构存放,结点值为int类型,设计一个递归算法
文章浏览阅读457次。帝国cms后台新建栏目如题提示,第一想到的就是没有权限创建文件夹,但检查过栏目取名的目录是有权限去创建的,为什么系统还会这样提示呢?这个时候要再去检查下/d/文件夹是否可写,创建栏目文件夹也将会在/d/目录下创建,如果这个文件夹不可写则会如题那样出错。以上方法都试了,还是显示建立目录不成功!请检查目录权限。为什么会出现这样的问题,会不会是因为加了手机端的插件?这时候,我把手机端暂时关闭,一刷新,居..._为什么cms生成文件后无法导致目录的变化
文章浏览阅读723次。面向对象编程_选定具体的目标(比如:猫狗花草等等),进行父类和子类的抽象化建模,确定属性和方法;