0

对于二维数组,我正在尝试创建一个标准化函数,它应该按行和按列工作。我不确定当使用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,)

由于我还是初学者,有人可以向我解释该怎么做吗?

4

1 回答 1

0

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

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 广播规则)。

因为这是一个很常见的问题,NumPy 开发人员引入了一个完全可以做到这一点的参数:keepdims=True,你应该在mean()and中使用它std()

def standardize(x, axis=None):
    return (x - x.mean(axis, keepdims=True)) / x.std(axis, keepdims=True)
于 2017-12-02T10:05:35.757 回答