У меня есть матрица [n x n], содержащая значения, принадлежащие разным группам, и вектор [1 x n], определяющий, к какой группе принадлежит каждый элемент. (n обычно ~1E4, в этом примере n=4)
Я хочу вычислить матрицу, полученную путем суммирования всех элементов, принадлежащих к одной группе.
Я использую np.where() для вычисления индексов, где расположены элементы каждой группы. Когда я использую рассчитанные индексы, я не получаю ожидаемых элементов, потому что я выбираю пары позиций вместо диапазонов (я привык к Matlab, где я могу просто выбрать M(idx1,idx2) ).
import numpy as np
n=4
M = np.random.rand(n,n)
print(M)
# This vector defines to which group each element belong
belongToGroup = np.array([0, 1, 0, 2])
nGroups=np.max(belongToGroup);
# Calculate a matrix obtained by summing elements belonging to the same group
M_sum = np.zeros((nGroups+1,nGroups+1))
for g1 in range(nGroups+1):
idxG1 = np.where(belongToGroup==g1)
for g2 in range(nGroups+1):
idxG2 = np.where(belongToGroup==g2)
print('g1 = ' + str(g1))
print('g2 = ' + str(g2))
print(idxG1[0])
print(idxG2[0])
print(M[idxG1[0],idxG2[0]])
print(np.sum(M[idxG1[0],idxG2[0]]))
M_sum[g1,g2]=np.sum(M[idxG1[0],idxG2[0]])
print('')
print('Example of the problem:')
print('Elements I would like to sum to obtain M_sum[0,0]')
print(M[0:2,0:2])
print('Elements that are summed instead')
print(M[[0,1],[0,1]])
Пример проблемы: в приведенном выше примере элемент M_sum[0,0] должен быть суммой M[0,0], M[0,1], M[1,0] и M[1,1 ] Вместо этого он рассчитывается как сумма M[0,0] и M[1,1]