Il metodo mean
è una riduzione operazione, ovvero converte una raccolta di numeri 1 in un numero singolo. Quando si applica una riduzione a una matrice n-dimensionale lungo un asse, numpy collassa quella dimensione sul valore ridotto, risultando in una matrice (n-1) -dimensionale. Nel suo caso, poiché X
ha forma (5, 10), ed è stata eseguita una riduzione lungo l'asse 1, si finisce con una matrice di forma (5,):
In [8]: m = X.mean(axis=1)
In [9]: m.shape
Out[9]: (5,)
Quando si tenta di sottrarre questo risultato da X
, si sta tentando di sottrarre una matrice con forma (5,) da una matrice con forma (5, 10). Queste forme non sono compatibili per broadcasting. (Date un'occhiata a the description of broadcasting in the User Guide.)
Per trasmettere come funziona, il risultato dell'operazione mean
deve essere un array di forma (5, 1) (compatibile con la forma (5, 10)). Nelle versioni recenti di numpy, le operazioni di riduzione, incluso mean
, hanno un argomento chiamato keepdims
che indica alla funzione di non comprimere la dimensione ridotta. Invece, una dimensione banale con lunghezza 1 viene mantenuto:
In [10]: m = X.mean(axis=1, keepdims=True)
In [11]: m.shape
Out[11]: (5, 1)
Con le versioni precedenti di NumPy, è possibile utilizzare reshape
per ripristinare la dimensione crollato:
In [12]: m = X.mean(axis=1).reshape(-1, 1)
In [13]: m.shape
Out[13]: (5, 1)
Quindi, a seconda della versione di numpy, si può fare questo:
Y = X - X.mean(axis=1, keepdims=True)
o questo:
Y = X - X.mean(axis=1).reshape(-1, 1)
Ora si può spiegare il motivo per cui 'X - X.mean (axis = 0) 'funziona senza il parametro' keepdims'? :) – hpaulj