对于给定的矩阵,我要从行中减去每一行的最大值。 在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]))
,但无济于事!
我到底在哪里错过了?非常感谢。
答案 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]