擅长:python、mysql、java
<p>对于那些不了解Numpy的人,我认为值得指出的是,八度(和Matlab的)的<code>*</code>算符(矩阵乘法)的等价物是<code>numpy.dot</code>(并且,值得商榷的是,<code>numpy.outer</code>)。Numpy的<code>*</code>运算符类似于倍频程中的<code>bsxfun(@times,...)</code>,它本身就是<code>.*</code>的泛化。</p>
<p>在倍频程中,当应用bsxfun时,在操作数“真”大小的右边有隐式的单重维度;也就是说,可以将<code>n1 x n2 x n3</code>数组视为<code>n1 x n2 x n3 x 1 x 1 x 1 x...</code>。在Numpy中,隐式的单重维度在左边;因此<code>m1 x m2 x m3</code>可以被认为是<code>... x 1 x 1 x m1 x m2 x m3</code>。这在考虑操作数大小时很重要:在倍频程中,如果a是<code>2 x 3 x 4</code>,b是<code>2 x 3</code>,那么<code>bsxfun(@times,a,b)</code>将起作用。在Numpy中,一个不能乘法两个这样的数组,但是一个可以乘法一个<code>2 x 3 x 4</code>和一个<code>3 x 4</code>数组。</p>
<p>最后,八度音阶中的<code>bsxfun(@times, X*Y, X)</code>可能看起来像<code>numpy.dot(X,Y) * X</code>。仍然有一些问题:例如,如果您期望的是一个外积(即,在倍频程中X是一个列向量,Y是一个行向量),那么您可以使用<code>numpy.outer</code>代替,或者小心X和Y的形状</p>