2016-04-28 5 views
0

Ich habe ein 2D-Numpy-Array zum Beispiel definiert A. Ich möchte es in einen anderen 2D-Arrays zu transformieren nach folgenden Aussagen:Wie subtrahiere und teile ich ein 2D-Array und ein 1D-Array in Python Numpy?

B = A - mean(A), the mean by the second axis 
C = B/mean(A) 

Ein Beispiel:

>>> import numpy as np 
>>> A = np.array([[1, 2, 3], [4, 6, 8]]) 
>>> A 
array([[1, 2, 3], 
     [4, 6, 8]]) 
>>> M = np.mean(A, axis=1) 
>>> M 
array([ 2., 6.]) 
>>> B = ... # ??? 
>>> B 
array([[-1., 0., 1.], 
     [-2., 0., 2.]]) 
>>> C = ... # ??? 
>>> C 
array([[-0.5, 0., 0.5], 
     [-0.33333333, 0., 0.33333333]]) 

Antwort

1

Sie können die Funktionen subtract und divide von numpy verwenden. Lösen von Ihrem Beispiel:

import numpy as np 
A = np.array([[1, 2, 3], [4, 6, 8]]) 
M = np.mean(A, axis=1) 
B = np.subtract(A.T,M).T 
C = np.divide(B.T,M).T 
print(B) 
print(C) 

, Ergebnisse in:

[[-1. 0. 1.] 
[-2. 0. 2.]] 
[[-0.5   0.   0.5  ] 
[-0.33333333 0.   0.33333333]] 
2

ärgerlicher, numpy.mean(axis=...) gibt Ihnen einen Array, in dem die entsprechende Achse hat eher gelöscht worden als auf Größe 1. Wenn Sie das also auf ein 2x3-Array mit Achse = 1 anwenden, erhalten Sie ein (Rang-1) -Array der Größe 2 statt des 2x1-Arrays, das Sie wirklich wollen.

Sie können dieses Problem beheben, indem Sie die keepdims Argument numpy.mean Versorgung:

M = np.mean(A, axis=1, keepdims=True) 

Wenn das nicht existiert hätte, wäre eine Alternative gewesen reshape zu verwenden.

2

Gareht McCaughan Lösung ist elegant, aber im Fall keepdims nicht gäbe, könnten Sie eine neue Achse zu M hinzufügen:

B = A - M[:, None] 

(M [: Keine] .shape ist (2, 1), also Rundfunk passiert)

Verwandte Themen