这是我的八度音阶代码:
sum(bsxfun(@times, X*Y, X), 2)
代码的bsxfun部分产生了按元素进行的乘法,因此我认为numpy.multiply(X*Y, X)
可以做到这一点,但我得到了一个异常。当我做了一些研究后,我发现在Python数组中,按元素进行乘法是行不通的(特别是如果X和Y是“numpy.ndarray”类型的话)。所以我想知道是否有人能解释得更清楚一点——也就是说,对不同类型的对象进行类型转换是否可行?八度代码可以工作,所以我知道我没有线性代数错误。我假设bsxfun和numpy.multiply实际上并不等价,但我不确定为什么这样的解释会很好。
我找到了一个website!这给了Matlab函数转换的倍频程,但对我来说似乎没有帮助。
bsxfun
在Matlab中表示二进制单重展开,在numpy中称为广播,应该自动发生。解决方案将取决于X
的维度,即它是行向量还是列向量,但是这个答案显示了一种方法:How to multiply numpy 2D array with numpy 1D array?
我认为这里的问题是广播需要其中一个维度是
1
,而且,与Matlab不同,numpy似乎区分了一维2元素向量和二维2元素,即形状矩阵(2,)
和形状矩阵(2,1)
之间的差异,广播需要后者。有点晚了,但是我想提供一个在python中有等价的
bsxfun
和repmat
的例子。这是我刚刚从Matlab转换到PythonNumpy的一点代码:Matlab:
在Python中等效:
对于那些不了解Numpy的人,我认为值得指出的是,八度(和Matlab的)的
*
算符(矩阵乘法)的等价物是numpy.dot
(并且,值得商榷的是,numpy.outer
)。Numpy的*
运算符类似于倍频程中的bsxfun(@times,...)
,它本身就是.*
的泛化。在倍频程中,当应用bsxfun时,在操作数“真”大小的右边有隐式的单重维度;也就是说,可以将
n1 x n2 x n3
数组视为n1 x n2 x n3 x 1 x 1 x 1 x...
。在Numpy中,隐式的单重维度在左边;因此m1 x m2 x m3
可以被认为是... x 1 x 1 x m1 x m2 x m3
。这在考虑操作数大小时很重要:在倍频程中,如果a是2 x 3 x 4
,b是2 x 3
,那么bsxfun(@times,a,b)
将起作用。在Numpy中,一个不能乘法两个这样的数组,但是一个可以乘法一个2 x 3 x 4
和一个3 x 4
数组。最后,八度音阶中的
bsxfun(@times, X*Y, X)
可能看起来像numpy.dot(X,Y) * X
。仍然有一些问题:例如,如果您期望的是一个外积(即,在倍频程中X是一个列向量,Y是一个行向量),那么您可以使用numpy.outer
代替,或者小心X和Y的形状相关问题 更多 >
编程相关推荐