2016-10-17 12 views
-1

Ich möchte jeden Wert von 2 Matrizen (a und b) der gleichen Größe effizienter nehmen und eine dritte boolesche (oder 1/0-Matrix, um Dinge sauber zu machen) in Matrix c zurückgeben, die die Ergebnisse der Bedingungen enthält.Was ist der effizienteste Weg, um jeden Wert von 2 numpy Matrizen zu vergleichen?

Beispiel:

Zustand: For a == 0 and b == 3

a = [[1 0] 
    [0 1]] 

b = [[3 5] 
    [3 9]] 

Würde zurück:

c = [[0 0] 
    [1 0]] 

[0,1] ist der einzige Ort, an dem a == 0 und b == 3 so ist es der einzige Ort True in c

Dies ist der Code, den ich habe bisher:

import numpy as np 

a = np.matrix("1, 0; 0 1") 
print(a,'\n') 
b = np.matrix("3, 5; 3 9") 
print(b,'\n') 

c = [] 
for x in range(0,np.shape(a)[1]): 
    row = [] 
    for y in range(0,np.shape(a)[1]): 
     row.append(int(a[x,y] == 0 and b[x,y] == 3)) # the int() is there just to keep things tighty for the 3 prints 
    c.append(row) 
c = np.matrix(c) 
print(c) 

Ergebnisse:

[[1 0] 
[0 1]] 

[[3 5] 
[3 9]] 

[[0 0] 
[1 0]] 

ich auch nutzen könnte:

a=a==0 
b=b==3 
c=a&b 

Aber das würde eine Kopie von a und b zu machen und mit großen Matrizen wäre das immer noch effizient?

Warum kann ich nicht einfach a == 0 & b == 3 verwenden?

Ich muss einen Vergleich wie das für mehrere Matrizen, die 1000+ Größe sind, so dass Sie sehen konnten, wo Iterieren dachte, sie wären ziemlich langsam.

Vielen Dank für jede Hilfe Ich bin mir sicher, die Antwort ist etwas einfach und direkt vor mir, aber ich bin nur dumm.

+0

Warum würde 'c = (a == 0) & (b == 3) .astype (int)' Kopien machen? –

+0

"Warum kann ich nicht einfach eine == 0 & b == 3?" - nur Vorrang. Sie müssen Klammern hinzufügen, um es zu disambiguieren, wie '(a == 0) & (b == 3)'. – user2357112

+0

@PadraicCunningham und user2357112 danke ich wusste einfach nicht, ich brauchte die Klammern – Whud

Antwort

0

Sie können Verwendung (ziemlich) viel der Ausdruck, den Sie wollten:

>>> (a == 0) & (b == 3) 
matrix([[False, False], 
     [ True, False]], dtype=bool) 

Vorsicht, Sie Notwendigkeit die Klammer die precendence trainieren zu machen, wie Sie möchten - Normalerweise wird & binden enger als ==. Wenn Sie die zusätzliche Klammer nicht mögen, können Sie die ausführlichere (obwohl wohl semantisch korrekte) np.logical_and Funktion verwenden.

Beachten Sie auch, dass zwar keine Kopien gemacht werden, gibt es temporäre Arrays erstellt werden. Insbesondere wird das Ergebnis von a == 0 und b == 3 in dieser Anweisung beide zugewiesen und freigegeben. Im Allgemeinen ist das keine so große Sache, und die vektorisierten Operationen von numpy bleiben schnell.Wenn jedoch, dass nicht schnell genug für Sie ist, Sie können eine Bibliothek wie numexpr verwenden, um die temporäre Arrays zu entfernen:

>>> numexpr.evaluate('(a == 0) & (b == 3)') 
array([[False, False], 
     [ True, False]], dtype=bool) 

Und natürlich, wenn Sie 1 und 0 benötigen, können Sie verwenden result.astype(int) auf dem Ausgabe-Array, um Arrays von Ints statt Booleans zu machen.

Verwandte Themen