Вы можете использовать collections.Counter
, чтобы получить значения, которые фактически появятся в матрице. Это работает, потому что кортежи являются хэшируемыми. Задание становится довольно простым:
counts = collections.Counter(coocPairs)
ind = np.array(list(counts.keys())).T
a[ind[0], ind[1]] = list(counts.values())
Как правило, np.unique
с return_counts=True
заменяет Counter
. В этом случае необходимо указать ось и иметь в виду, что это будет одно из более медленных решений:
ind, count = np.unique(coocPairs, return_counts=True, axis=0)
a[ind.T[0], ind.T[1]] = count
Вместо этого вы можете преобразовать свои пары в линейные индексы в уравненной матрице. :
ind = np.ravel_multi_index(tuple(np.array(coocPairs).T), a.shape)
Теперь вы можете сделать
ind, count = np.unique(ind, return_counts=True)
a.ravel()[ind] = count
В качестве альтернативы вы можете использовать np.bincount
, чтобы получить счет намного быстрее, или np.add.at
, чтобы избежать предварительный подсчет. Решение bincount
с округленным индексом избавляет вас от необходимости предварительного распределения a
:
ind = np.ravel_multi_index(tuple(np.array(coocPairs).T), (n, n))
a = np.bincount(ind, minlength=n * n).reahape(n, n)