我正在尝试将一些 Matlab 代码转移到 Python,其中一些代码使用 bsxfun() 函数进行虚拟复制,然后进行乘法或除法运算(我还使用它进行逻辑运算)。为了节省内存和时间,我希望能够在执行乘法或除法之前不实际复制向量(使用函数或对角矩阵等方式)来完成此操作。
如果在某种 C 库中有 bsxfun 的等效函数,那当然也可以使用。
我不知道是否有与bsxfun相当的东西,尽管像其他人所说,numpy确实会帮你处理许多广播。这常常被宣传为numpy比matlab更具优势的一个原因,而事实上,bsxfun更加通用,因为它可以接受用户自定义函数。
Numpy有这个: http://docs.scipy.org/doc/numpy/reference/generated/numpy.apply_along_axis.html 但只适用于1d。
与Matlab相比,Python非常易于使用。在Python的NumPy库中,bsxfun(x)可以通过array[]中的...来轻松完成,例如m[...,:]。你可以尝试这样做:
>>>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.]]
bsxfun
,所以我猜这个也可以反过来用。 - jcollado