如何按行标准化矩阵(轴= 1)?

How to standardize matrix row-wise (axis=1)?

对于二维数组,我正在尝试制作一个标准化函数,它应该按行和按列工作。当使用 axis=1 (按行)给出参数时,我不确定该怎么做。

def standardize(x, axis=None):
if axis == 0:
    return (x - x.mean(axis)) / x.std(axis)
else:
    ?????

我试图在这部分将 axis 更改为 axis = 1(x - x.mean(axis)) / x.std(axis)

但是我得到了以下错误:

 ValueError: operands could not be broadcast together with shapes (4,3) (4,)

谁能告诉我该怎么做,因为我还是个初学者?

您看到错误的原因是您无法计算

x - x.mean(1)

因为

x.shape = (4, 3)
x.mean(1).shape = (4,)  # mean(), sum(), std() etc. remove the dimension they are applied to

但是,如果我们能够以某种方式确保 mean() 保持它应用到的维度 ,则您可以执行该操作,从而导致

x.mean(1).shape = (4, 1)

(查找NumPy Broadcasting rules)。

因为这是一个很常见的问题,NumPy 开发人员引入了一个参数来实现这一点:keepdims=True,您应该在 mean()std() 中使用它:

def standardize(x, axis=None):
    return (x - x.mean(axis, keepdims=True)) / x.std(axis, keepdims=True)