2016-06-22 1 views
0

Ich habe zwei Arrays wie folgt:Counting Übereinstimmung zwischen zwei Arrays bei gleicher Indexposition und mit nicht Null-Wert

b = array([[1, 0, 1], 
      [0, 0, 1]]) 

c = array([[ 0.5 , 0. ], 
      [ 0.34, 1. ], 
      [ 0. , 1. ]]) 

Wie passende Werte von zwei Feldern basierend auf demselben Indexwert zu zählen und den Elementwert der Array sollte nicht null sein. Hier basiert der übereinstimmende Wert auf dem Index des Elements und nicht auf dem genauen Wert.

Für z. In den obigen Matrizen sind meine zwei Arrays eine Zeile von b und eine entsprechende Spalte von c. Wenn Sie sehen, stimmt 0,5 c [0,0] in c mit 1 (b [0,0]) von b überein. Der Wert stimmt nicht überein, aber da sie keine Nullwerte sind und an der gleichen Position in den entsprechenden Arrays (beide im 0. Index vorhanden) vorhanden sind, sollte er gezählt werden. Wenn der Wert in beiden Array-Positionen Null ist, wird er nicht gezählt.

Für die obigen Matrizen sollte ich 2 Treffer erhalten, weil die erste Zeile von b und die erste Spalte von c gemeinsame Nicht-Null-Elemente bei nur einem Wert haben: b [0,0] oder c [0,0]. In ähnlicher Weise hat die zweite Zeile von b eine Übereinstimmung mit der zweiten Spalte von c: b [1,2] oder c [2,1]

Ich habe den folgenden Code versucht, aber es ergibt Summe als 3 anstelle von 2. Weil es zählt auch den Fall, wo beide die Position 0 als Wert haben und es auch das entspricht. Ich möchte einen Wert ungleich null an der gleichen Position in zwei Arrays haben.

sum=0 
for x in range(b.shape[0]): 
    sum+=np.sum((b[x,:]==0) == (c[:,x]==0)) 

Ich versuchte es dann: das würde zuerst die Nicht-Null-Indizes der beiden Arrays erhalten und dann vergleichen. Aber es gibt einen Fehler.

sum=0 
for x in range(b.shape[0]): 
    sum+= np.sum((np.nonzero(b[x,:]!=0)) == (np.nonzero(c[:,x]!=0))) 


ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

Warum haben Sie die vorherige Version dieser Frage gelöscht, anstatt sie einfach zu aktualisieren? – Prune

+0

aktualisiert die Frage. Ich löschte, weil ich nicht sicher war, ob jemand, der es nahte, Sichtbarkeit erhalten würde oder nicht – Baktaawar

Antwort

1

Ihr kritisches Problem ist die Überprüfung, dass die "Nicht-Null" Werte sind gleich: Sie benötigen einen und hier nicht ==:

sum += np.sum((b[x,:]!=0) & (c[:,x]!=0)) 

Dies ergibt das gewünschte Ergebnis .

import numpy as np 

b = np.array([[1, 0, 1], 
      [0, 0, 1]]) 

c = np.array([[ 0.5 , 0. ], 
      [ 0.34, 1. ], 
      [ 0. , 1. ]]) 

sum=0 
for x in range(b.shape[0]): 
    print "row/col", x 
    print b[x,:]!=0 
    print c[:,x]!=0 
    sum+=np.sum((b[x,:]!=0) & (c[:,x]!=0)) 

print sum 
+0

Danke das funktioniert. Ich habe das auch versucht, und es funktioniert, wenn ich irgendeine() sum = 0 für x im Bereich (b.shape [0]): e = np.array (np.nonzero (b [x ,:]! = 0)) f = np.array (np.nonzero (c [:, x]! = 0)) drucken e drucken f summe + = np.sum (e.any() == f.any ()) Summe – Baktaawar

+0

Ich habe einen Zusatz dazu. Anstatt nur 1 zu zählen, wo es eine Übereinstimmung des gleichen Indexstandorts ungleich Null gibt, wie man im Array c (1/Indexposition) zählt. Also, wo auch immer es eine Übereinstimmung von Nicht-Null-Wert an der gleichen Indexposition zwischen zwei Arrays gibt, addiere 1/Indexposition von c-Array, wo die Übereinstimmung aufgetreten ist – Baktaawar

+0

Erzeuge einen Vektor mit den benötigten booleschen Werten; Sie sollten in der Lage sein, herauszufinden, wie man 1/** N + 1 ** für Index ** N ** über den Vektor summiert. – Prune

Verwandte Themen