2016-06-22 2 views
0

У меня есть два массива, как показано ниже:Подсчет матч между двумя массивами в той же позиции индекса и имеющего, не нулевые значения

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

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

Как подсчитать соответствие значений двух массивов на основе той же значения индекса и значение элемента массив должен быть равен нулю. Здесь значение соответствия основано на индексе элемента, а не на точном значении.

Для примера. в приведенных выше матрицах мои две массивы являются строками b и соответствующим столбцом c. Если вы видите, 0,5 c [0,0] в c соответствует 1 (b [0,0]) b. Значение не совпадает, но поскольку они являются ненулевыми значениями и присутствуют в одной и той же позиции в соответствующих массивах (оба присутствуют в 0-м индексе), их следует учитывать. Если значение равно нулю в любой позиции массива, то оно не будет считаться.

Для вышеуказанных матриц я должен получить 2 обращения, потому что первая строка b и первый столбец c имеет общие ненулевые элементы только при одном значении: b [0,0] или c [0,0]. Аналогично, вторая строка b имеет один совпадение со вторым столбцом c: b [1,2] или c [2,1]

Я пробовал следующий код, но он дает сумму как 3 вместо 2. Потому что он также учитывает случай, когда обе позиции имеют значение 0, и это тоже соответствует. Я хочу, чтобы ненулевое значение находилось в одной позиции в двух массивах.

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

Я тогда попробовал это: сначала будут получать ненулевые индексы обоих массивов, а затем сравнить. Но это дает ошибку.

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

Почему вы удалили предыдущую версию этого вопроса, а не просто обновили его соответствующим образом? – Prune

+0

обновил вопрос. Я удалил, потому что я не был уверен, что кто-то положит его на закрытие, получит видимость или нет. – Baktaawar

ответ

1

Ваша критическая проблема проверки, что значения «ненулевые» равны: вам нужно и здесь, а не ==:

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

Это дает желаемый результат .

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

Спасибо, что работает. Я тоже это пробовал, и он работает, если я использую any() sum = 0 для x в диапазоне (b.shape [0]): e = np.array (np.nonzero (b [x ,:]! = 0)) f = np.array (np.nonzero (c [:, x]! = 0)) print e print f sum + = np.sum (e.any() == f.any ()) сумма – Baktaawar

+0

У меня есть одно дополнение к этому. Вместо того, чтобы просто подсчитывать 1, где есть нулевое совпадение позиции индекса, как считать (1/позицию индекса) в массиве c ?. Таким образом, в основном везде, где есть совпадение ненулевого значения в одной позиции индекса между двумя массивами, добавьте 1/индексную позицию массива c, где произошло совпадение – Baktaawar

+0

Генерировать вектор с необходимыми булевыми значениями; вы должны выяснить, как суммировать 1/** N + 1 ** для индекса ** N ** над вектором. – Prune

Смежные вопросы