2013-04-20 3 views
3

Мне нужно проанализировать квадратичный 2D-массив LL для значений, которые являются симметричными (LL [i, j] == LL [j, i]), а не ноль.numpy: найти симметричные значения в массивах 2d

Есть ли более быстрый и более «массивный» способ без циклов для этого? Есть ли простой способ хранения индексов значений для последующего использования без создания массива и добавления кортежа индексов в каждом цикле?

Вот мой классический подход зацикливание хранить индексы:

IdxArray = np.array() # Array to store the indices 
for i in range(len(LL)): 
    for j in range(i+1,len(LL)): 
     if LL[i,j] != 0.0: 
      if LL[i,j] == LL[j,i]: 
       IdxArray = np.vstack((IdxArray,[i,j]))      

позже использовать индексы:

for idx in IdxArray: 
    P = LL[idx]*(TT[idx[0]]-TT[idx[1]]) 
    ... 

ответ

2

Как об этом:

a = np.array([[1,0,3,4],[0,5,4,6],[7,4,4,5],[3,4,5,6]]) 

np.fill_diagonal(a, 0) # changes original array, must be careful 

overlap = (a == a.T) * a 
indices = np.argwhere(overlap != 0) 

Результат:

>>> a 
array([[0, 0, 3, 4], 
     [0, 0, 4, 6], 
     [7, 4, 0, 5], 
     [3, 4, 5, 0]]) 
>>> overlap 
array([[0, 0, 0, 0], 
     [0, 0, 4, 0], 
     [0, 4, 0, 5], 
     [0, 0, 5, 0]]) 
>>> indices 
array([[1, 2], 
     [2, 1], 
     [2, 3], 
     [3, 2]]) 
+0

Очень красивый подход тоже. Моя диагональ уже равна нулю. Пока это мой любимый. – user2303141

3
>>> a = numpy.matrix('5 2; 5 4') 
>>> b = numpy.matrix('1 2; 3 4') 
>>> a.T == b.T 
matrix([[False, False], 
     [ True, True]], dtype=bool) 
>>> a == a.T 
matrix([[ True, False], 
     [False, True]], dtype=bool) 
>>> numpy.nonzero(a == a.T) 
(matrix([[0, 1]]), matrix([[0, 1]])) 
+0

Спасибо, таким образом, я могу вычислить соответствующие ячейки в матрице. Это охватывает мой первый блок кода. Но как мне получить индексы из этой логической матрицы, потому что без индексов я не могу получить доступ к массиву TT? – user2303141

+0

С triu_indices это может сработать. Я попробую. – user2303141