在Python中是否有与MATLAB函数bsxfun等效的东西?

时间:2012-01-20 19:27:16

标签: python c matlab bsxfun

我正在尝试将我的一些代码从matlab移植到python,其中一些使用bsxfun()函数进行虚拟复制,然后进行乘法或除法(我也将它用于逻辑运算)。我希望能够在没有实际复制矢量(使用函数或某种对角矩阵)之前进行乘法或除法,以节省内存和时间。

如果某个C库中存在等效的bsxfun,那当然也可以。

2 个答案:

答案 0 :(得分:4)

我并不知道有什么相当于bsxfun,尽管numpy确实为你做了很多广播,正如其他人提到的那样。

这通常被认为是numpy优于matlab的优势,并且确实很多广播在numpy中更简单,但是bsxfun实际上更通用,因为它可以采用用户定义的函数。

Numpy有这个: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html 但仅限1d。

答案 1 :(得分:2)

与matlab相比,Python非常易于使用 python numpy中的bsxfun(x)可以通过...在array []中轻松完成,例如:米[...,:] 你可以试试这个:

>>>m = np.zeros([5,13], dtype=np.float32)
>>>print(m)

    [[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
     [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
     [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
     [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
     [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]

>>>c=np.array([[1,2,3,4,5,6,7,8,9,10,11,12,13]])
>>>print(m[...,:] +4*c)
[[  4.   8.  12.  16.  20.  24.  28.  32.  36.  40.  44.  48.  52.]
 [  4.   8.  12.  16.  20.  24.  28.  32.  36.  40.  44.  48.  52.]
 [  4.   8.  12.  16.  20.  24.  28.  32.  36.  40.  44.  48.  52.]
 [  4.   8.  12.  16.  20.  24.  28.  32.  36.  40.  44.  48.  52.]
 [  4.   8.  12.  16.  20.  24.  28.  32.  36.  40.  44.  48.  52.]]