使用@times将bsxfun转换为numpy

2024-09-29 21:41:39 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的八度音阶代码:

sum(bsxfun(@times, X*Y, X), 2)

代码的bsxfun部分产生了按元素进行的乘法,因此我认为numpy.multiply(X*Y, X)可以做到这一点,但我得到了一个异常。当我做了一些研究后,我发现在Python数组中,按元素进行乘法是行不通的(特别是如果X和Y是“numpy.ndarray”类型的话)。所以我想知道是否有人能解释得更清楚一点——也就是说,对不同类型的对象进行类型转换是否可行?八度代码可以工作,所以我知道我没有线性代数错误。我假设bsxfun和numpy.multiply实际上并不等价,但我不确定为什么这样的解释会很好。

我找到了一个website!这给了Matlab函数转换的倍频程,但对我来说似乎没有帮助。


Tags: 对象代码numpy元素类型错误数组multiply
3条回答

bsxfun在Matlab中表示二进制单重展开,在numpy中称为广播,应该自动发生。解决方案将取决于X的维度,即它是行向量还是列向量,但是这个答案显示了一种方法:

How to multiply numpy 2D array with numpy 1D array?

我认为这里的问题是广播需要其中一个维度是1,而且,与Matlab不同,numpy似乎区分了一维2元素向量和二维2元素,即形状矩阵(2,)和形状矩阵(2,1)之间的差异,广播需要后者。

有点晚了,但是我想提供一个在python中有等价的bsxfunrepmat的例子。这是我刚刚从Matlab转换到PythonNumpy的一点代码:

Matlab:

x =

    -2
    -1
     0
     1
     2

n =

 2

M = repmat(x,1,n+1)

M =

    -2    -2    -2
    -1    -1    -1
     0     0     0
     1     1     1
     2     2     2


M = bsxfun(@power,M,0:n)

M =

     1    -2     4
     1    -1     1
     1     0     0
     1     1     1
     1     2     4

在Python中等效:

In [8]: x
Out[8]: 
array([[-2],
       [-1],
       [ 0],
       [ 1],
       [ 2]])

In [9]: n=2

In [11]: M = np.tile(x, (1, n + 1))

In [12]: M
Out[12]: 
array([[-2, -2, -2],
       [-1, -1, -1],
       [ 0,  0,  0],
       [ 1,  1,  1],
       [ 2,  2,  2]])



In [13]:  M = np.apply_along_axis(pow, 1, M, range(n + 1))

In [14]: M
Out[14]: 
array([[ 1, -2,  4],
       [ 1, -1,  1],
       [ 1,  0,  0],
       [ 1,  1,  1],
       [ 1,  2,  4]])

对于那些不了解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的形状

相关问题 更多 >

    热门问题