首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组(k,)或(k,n)乘以一维数组(k,)

将数组(k,)或(k,n)乘以一维数组(k,)
EN

Stack Overflow用户
提问于 2018-09-04 12:42:24
回答 1查看 78关注 0票数 3

我有时使用一维数组:

代码语言:javascript
复制
A = np.array([1, 2, 3, 4])

或2D阵列(用scipy.io.wavfile读取的单或立体声信号):

代码语言:javascript
复制
A = np.array([[1, 2], [3, 4], [5, 6], [7,8]])

不需要用if A.ndim == 2:来区分这两种情况.,是否有一个简单的单行解决方案可以将这个数组A乘以一个一维数组B = np.linspace(0., 1., 4)

如果A是1D,那么它就是A * B,如果A是2D,我的意思是将A的每一行乘以B的每个元素。

注意:当使用scipy.io.wavfile读取单声和立体声时,这个问题自然会出现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-04 12:45:09

方法#1

我们可以用einsum来覆盖普通的ndarrays

代码语言:javascript
复制
np.einsum('i...,i->i...',A,B)

这里起作用的诀窍是ellipsis,它像在A中一样,广播第一个轴之后的尾随维,并将它们保持在输出中,同时保持两个输入的第一个轴对齐,这就是这里的预期乘法。有了A作为1D数组,就没有广播,这基本上可以简化为:np.einsum('i,i->i',A,B)

按示意图排列:

代码语言:javascript
复制
A   :  i x ....
B   :  i 
out :  i x ....

因此,具有任意尺寸的A的封面。

有关从文档中使用ellipsis的更多信息:

若要启用和控制广播,请使用省略号。默认的NumPy风格的广播是通过在每个术语的左边添加一个省略号来完成的,比如np.einsum(‘.ii->.i’,a).要沿着第一个和最后一个轴进行跟踪,可以执行np.einsum(‘i.i’,a),或者用最左而不是最右的索引做矩阵矩阵积,您可以做np.einsum(‘ij.,jk.>ik.’,a,b)。

方法#2

利用我们试图将A的第一轴与一维数组B的唯一轴对齐的事实,我们可以简单地转置A,与B相乘,最后转置回-

代码语言:javascript
复制
(A.T*B).T
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52166639

复制
相关文章

相似问题

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