12

这是我在 Octave 中的代码:

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

代码的 bsxfun 部分产生逐元素乘法,所以我认为这numpy.multiply(X*Y, X)可以解决问题,但我遇到了一个例外。当我做了一些研究时,我发现逐元素乘法不适用于 Python 数组(特别是如果 X 和 Y 的类型为“numpy.ndarray”)。所以我想知道是否有人可以对此进行更多解释——即,将类型转换为不同类型的对象工作?Octave 代码有效,所以我知道我没有线性代数错误。我假设 bsxfun 和 numpy.multiply 实际上并不等效,但我不确定为什么任何解释都会很好。

我能够找到一个网站!这将 Octave 提供给 Matlab 函数转换,但在我的情况下似乎没有帮助。

4

3 回答 3

14

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

如何将 numpy 2D 数组与 numpy 1D 数组相乘?

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

于 2014-05-08T14:47:45.390 回答
3

对于那些不了解 Numpy 的人,我认为值得指出的是 Octave(和 Matlab 的)*运算符(矩阵乘法)的等价物是numpy.dot(并且,有争议的是numpy.outer)。Numpy 的*运算符类似于bsxfun(@times,...)Octave 中的运算符,它本身就是.*.

在 Octave 中,当应用 bsxfun 时,在操作数的“真实”大小的右侧存在隐含的单例维度;也就是说,一个n1 x n2 x n3数组可以被认为是n1 x n2 x n3 x 1 x 1 x 1 x...。在 Numpy 中,隐式单例维度位于左侧;所以 am1 x m2 x m3可以认为是... x 1 x 1 x m1 x m2 x m3。这在考虑操作数大小时很重要:在 Octave 中,bsxfun(@times,a,b)如果 a is2 x 3 x 4和 b is将起作用2 x 3。在 Numpy 中,不能将两个这样的数组相乘,但可以将 a2 x 3 x 4和一个3 x 4数组相乘。

最后,bsxfun(@times, X*Y, X)在 Octave 中可能看起来像numpy.dot(X,Y) * X. 仍然有一些问题:例如,如果您期望一个外部产品(即,在 Octave X 中,X 是列向量,Y 是行向量),您可以考虑numpy.outer改用,或者注意 X 的形状和 Y。

于 2014-05-09T18:04:55.110 回答
0

有点晚了,但我想提供一个在 python中具有等效bsxfun和的示例。repmat这是我刚刚从 Matlab 转换为 Python numpy 的一些代码:

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]])
于 2018-11-02T01:23:18.317 回答