Python v / s MATLAB中的Repmat

时间:2018-06-20 20:43:43

标签: python matlab

对于给定的矩阵,我要从行中减去每一行的最大值。 在MATLAB中,我会做类似

的操作
Xm = X - repmat(max(X,[],2), 1, size(X,2));

对于Python,我一直在玩

的变体

Xm = X - np.matlib.repmat(np.max(X,axis = 1), 1, len(X[0])),但无济于事!

我到底在哪里错过了?非常感谢。

1 个答案:

答案 0 :(得分:1)

在Python / NumPy中,无需显式复制数组以使其与另一个匹配。大小为1的尺寸(单个尺寸)为automatically expanded in a process they call "broadcasting"

例如,给定

X = np.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])

你可以写

X - np.max(X, axis=0)

np.max返回的数组的形状为(5,),与X(3, 5))的形状兼容。 NumPy将从最后一个维度开始对齐形状,如果一个数组少于另一个数组,则NumPy会在前面填充单例尺寸。

但是,此过程有时需要一点帮助。因为np.max返回的数组的维数小于输入的维数,所以广播通常不能。匹配这些数组。例如,X - np.max(X, axis=1)不起作用。

最好的解决方案是对keepdims使用np.max参数:

X - np.max(X, axis=1, keepdims=True)

另一种选择是在索引中使用np.newaxis添加单例尺寸:

X - np.max(X, axis=1)[:, np.newaxis]