2017-05-11 1 views
1

ich eine Matrix aus folgendem Format haben:Multiplying durch Musterabgleich

matrix = np.array([1, 2, 3, np.nan], 
        [1, np.nan, 3, 4], 
        [np.nan, 2, 3, np.nan]) 

und Koeffizienten Ich möchte selektiv elementweise mit meiner Matrix multiplizieren:

coefficients = np.array([0.5, np.nan, 0.2, 0.3], 
         [0.3, 0.3, 0.2, np.nan], 
         [np.nan, 0.2, 0.1, np.nan]) 

In diesem Fall würde ich möchte, dass die erste Zeile in matrix mit der zweiten Zeile in coefficients multipliziert wird, während die zweite Zeile in matrix mit der ersten Zeile in coefficients multipliziert werden würde. Kurz gesagt, ich möchte die Zeile in coefficients auswählen, die Zeile in matrix in Bezug auf wo np.nan Werte befinden übereinstimmt. Die Positionen np.nan werden für jede Zeile in coefficients unterschiedlich sein, da sie die Koeffizienten für verschiedene Fälle von Datenverfügbarkeit beschreiben

Gibt es einen schnellen Weg, dies zu tun, erfordert das Schreiben if-Anweisungen für alle möglichen Fälle nicht?

Antwort

2

Ansatz # 1

A Schnell Weg wäre mit NumPy broadcasting -

# Mask of NaNs       
mask1 = np.isnan(matrix) 
mask2 = np.isnan(coefficients) 

# Perform comparison between each row of mask1 against every row of mask2 
# leading to a 3D array. Look for all-matching ones along the last axis. 
# These are the ones that shows the row matches between the two input arrays - 
# matrix and coefficients. Then, we use find the corresponding matching 
# indices that gives us the pair of matches betweel those two arrays 
r,c = np.nonzero((mask1[:,None] == mask2).all(-1)) 

# Index into arrays with those indices and perform elementwise multiplication 
out = matrix[r] * coefficients[c] 

Output für gegebene Abtastdaten -

In [40]: out 
Out[40]: 
array([[ 0.3, 0.6, 0.6, nan], 
     [ 0.5, nan, 0.6, 1.2], 
     [ nan, 0.4, 0.3, nan]]) 

Ansatz # 2

012.351.

Für Leistung reduzieren jede Reihe von NaNs seiner Dezimaläquivalent maskiert und dann ein Speicherfeld erstellen, in denen wir Elemente speichern können matrix aus und dann multiplizieren in die Elemente aus coefficients von diesem Dezimaläquivalente indexieren -

R = 2**np.arange(matrix.shape[1]) 
idx1 = mask1.dot(R) 
idx2 = mask2.dot(R) 

A = np.empty((idx1.max()+1, matrix.shape[1])) 
A[idx1] = matrix 
A[idx2] *= coefficients 
out = A[idx1] 
+0

Können Sie erklären, was 'mask1 [:, None] == mask2' macht? – galliwuzz

+1

@galliwuzz Hinzugefügt Kommentare dazu. – Divakar

Verwandte Themen