Эффективный способ получить 2d-массив (вид матрицы смежности) из 1d-массива

Для массива, скажем, a = np.array([1,2,1,0,0,1,1,2,2,2]) необходимо создать что-то вроде «матрицы» смежности A. т.е. A — это симметричный массив (n, n) numpy, где n = len(a) и A[i,j] = 1, если a[i] == a[j] и 0 в противном случае (i = 0...n-1 и j = 0...n-1):

  0 1 2 3 4 5 6 7 8 9
0 1 0 1 0 0 1 1 0 0 0
1   1 0 0 0 0 0 1 1 1
2     1 0 0 1 1 0 0 0
3       1 1 0 0 0 0 0
4         1 0 0 0 0 0
5           1 1 0 0 0
6             1 0 0 0
7               1 1 1
8                 1 1
9                   1

Тривиальное решение

n = len(a)
A = np.zeros([n, n]).astype(int)
for i in range(n):
    for j in range(n):
        if a[i] == a[j]:
            A[i, j] = 1
        else:
            A[i, j] = 0

Можно ли это сделать numpy способом, то есть без петель?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать пустое вещание:

b = (a[:,None]==a).astype(int)
df = pd.DataFrame(b)

выход:

   0  1  2  3  4  5  6  7  8  9
0  1  0  1  0  0  1  1  0  0  0
1  0  1  0  0  0  0  0  1  1  1
2  1  0  1  0  0  1  1  0  0  0
3  0  0  0  1  1  0  0  0  0  0
4  0  0  0  1  1  0  0  0  0  0
5  1  0  1  0  0  1  1  0  0  0
6  1  0  1  0  0  1  1  0  0  0
7  0  1  0  0  0  0  0  1  1  1
8  0  1  0  0  0  0  0  1  1  1
9  0  1  0  0  0  0  0  1  1  1

Если вам нужен только верхний треугольник, используйте numpy.tril_indices:

b = (a[:,None]==a).astype(float)
b[np.tril_indices_from(b, k=-1)] = np.nan
df = pd.DataFrame(b)

выход:

     0    1    2    3    4    5    6    7    8    9
0  1.0  0.0  1.0  0.0  0.0  1.0  1.0  0.0  0.0  0.0
1  NaN  1.0  0.0  0.0  0.0  0.0  0.0  1.0  1.0  1.0
2  NaN  NaN  1.0  0.0  0.0  1.0  1.0  0.0  0.0  0.0
3  NaN  NaN  NaN  1.0  1.0  0.0  0.0  0.0  0.0  0.0
4  NaN  NaN  NaN  NaN  1.0  0.0  0.0  0.0  0.0  0.0
5  NaN  NaN  NaN  NaN  NaN  1.0  1.0  0.0  0.0  0.0
6  NaN  NaN  NaN  NaN  NaN  NaN  1.0  0.0  0.0  0.0
7  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  1.0  1.0
8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  1.0
9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0

Другие вопросы по теме