我有时使用一维数组:
A = np.array([1, 2, 3, 4])或2D阵列(用scipy.io.wavfile读取的单或立体声信号):
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读取单声和立体声时,这个问题自然会出现。
发布于 2018-09-04 12:45:09
方法#1
我们可以用einsum来覆盖普通的ndarrays
np.einsum('i...,i->i...',A,B)这里起作用的诀窍是ellipsis,它像在A中一样,广播第一个轴之后的尾随维,并将它们保持在输出中,同时保持两个输入的第一个轴对齐,这就是这里的预期乘法。有了A作为1D数组,就没有广播,这基本上可以简化为:np.einsum('i,i->i',A,B)。
按示意图排列:
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相乘,最后转置回-
(A.T*B).Thttps://stackoverflow.com/questions/52166639
复制相似问题