需要帮助将Matlab的bsxfun转换为numpy

时间:2016-05-09 09:12:43

标签: python matlab numpy

我正在尝试转换一段MATLAB代码,这是我正在努力的一条线:

f = 0
wlab = reshape(bsxfun(@times,cat(3,1-f,f/2,f/2),lab),[],3)

我想出了

wlab = lab*(np.concatenate((3,1-f,f/2,f/2))) 

我现在如何重塑它?

4 个答案:

答案 0 :(得分:5)

不会为您的代码执行此操作,但更多是作为一般知识:

bsxfun是一个填补MATLAB的空白的函数,python不需要填充:广播。

广播是这样的事情:如果正在乘法/相加的矩阵/任何类似的矩阵与正在使用的另一个矩阵的大小不同,则矩阵将被重复。

所以在python中,如果你有一个3D矩阵A并且你想要将它的每个2D切片与2D的矩阵B相乘,你不需要任何其他东西,python将广播{ {1}}对你来说,它会一次又一次地重复矩阵。 B就足够了。但是,在MATLAB中会引发错误A*B。为了解决这个问题,您将Matrix dimension mismatch用作bsxfun,这将在bsxfun(@times,A,B)的第三维上广播(重复)B

这意味着将A转换为python通常不需要任何内容​​。

答案 1 :(得分:2)

MATLAB

 reshape(x,[],3)

相当于numpy

 np.reshape(x,(-1,3))

[]-1是占位符,以便在这里填写正确的形状'。

===============

我刚试过MATLAB表达式是Octave - 它在不同的机器上,所以我只是总结一下这个动作。

对于lab=1:6(6个元素),bsxfun产生(1,6,3)矩阵; reshape将其转换为(6,3),即只删除第一个维度。 cat生成一个(1,1,3)矩阵。

np.reshape(np.array([1-f,f/2,f/2])[None,None,:]*lab[None,:,None],(-1,3))

对于具有形状(n,m)的labbsxfun产生(n,m,3)矩阵;重塑将成为它(n * m,3)

因此对于2d labnumpy需要

np.array([1-f,f/2,f/2])[None,None,:]*lab[:,:,None]

(在MATLAB中,lab将始终为2d(或更大),因此即使n为1,第二种情况也更接近其动作。

=======================

np.array([1-f,f/2,f/2])*lab[...,None]

会处理任何形状lab

如果我制作Octave lab(4,2,3),`bsxfun也是(4,2,3)

匹配的numpy表达式将是

In [94]: (np.array([1-f,f/2,f/2])*lab).shape
Out[94]: (4, 2, 3)

numpy将尺寸添加到(3,)数组的开头以匹配lab的尺寸,实际上

(np.array([1-f,f/2,f/2])[None,None,:]*lab) # for 3d lab

如果f=0,则数组为[1,0,0],因此这会使lab的最后一个维度上的值归零。实际上,改变了颜色'。

答案 2 :(得分:0)

相当于

import numpy as np
wlab = np.kron([1-f,f/2,f/2],lab.reshape(-1,1))

答案 3 :(得分:0)

在Python中,如果您使用numpy,则不需要进行任何广播,因为这是自动完成的。

例如,查看以下代码应该更清楚:

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8], [9, 10, 100]])
>>> b = np.array([1, 2, 3])
>>>
>>> a
    array([[  1,   2,   3],
           [  3,   4,   5],
           [  6,   7,   8],
           [  9,  10, 100]])
>>> b
array([1, 2, 3])
>>>
>>> a - b
    array([[ 0,  0,  0],
           [ 2,  2,  2],
           [ 5,  5,  5],
           [ 8,  8, 97]])
>>>
相关问题