首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c_i :创建包含条目的矩阵的快速方法* C_{ij}

c_i :创建包含条目的矩阵的快速方法* C_{ij}
EN

Stack Overflow用户
提问于 2012-12-03 21:00:34
回答 5查看 613关注 0票数 2

我正在寻找一种快速的方法来从给定的向量b_i和另一个矩阵C_{ij}创建一个新的矩阵A_{ij}。新矩阵的组件应具有以下形式

代码语言:javascript
运行
复制
A_{ij} = b_i * C_{ij}.

到目前为止,我使用的是dot(diag(b), C),但是点积自然有很多与零的乘法,这是相当低效的。有没有更好的方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-03 21:19:21

使用*,这是具有适当广播功能的元素产品:

代码语言:javascript
运行
复制
>>> b = array([1,2,3])
>>> C = arange(9).reshape(3,3)
>>> dot(diag(b), C)
array([[ 0,  1,  2],
       [ 6,  8, 10],
       [18, 21, 24]])
>>> atleast_2d(b).T * C
array([[ 0,  1,  2],
       [ 6,  8, 10],
       [18, 21, 24]])

atleast_2d(b).T (或b.reshape(-1,1))将向量b重塑为列向量。

票数 2
EN

Stack Overflow用户

发布于 2013-03-08 11:30:45

您也可以使用einsum

代码语言:javascript
运行
复制
>>> b = np.array([1,2,3])
>>> C = np.arange(9).reshape(3,3)
>>> np.einsum('i,ij->ij', b, C)
array([[ 0,  1,  2],
       [ 6,  8, 10],
       [18, 21, 24]])

在我的机器上,这种方法比两种方法都快

代码语言:javascript
运行
复制
np.dot(np.diag(b), C)

代码语言:javascript
运行
复制
np.atleast_2d(b).T * C

对于100,000个循环,einsum耗时1.16秒,dot耗时1.61秒,atleast_2d耗时2.03秒。

如果您熟悉Einstein summation notation,那么einsum是一个非常有用的函数。使用索引表示法可以更容易地表示许多简单的线性代数运算,并且增加的执行速度只是锦上添花。

票数 1
EN

Stack Overflow用户

发布于 2012-12-03 21:15:06

将矩阵转换为数组,执行(广播)数组乘法,然后转换回来:

代码语言:javascript
运行
复制
np.matrix(b * np.asarray(C))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13683804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档