Я хочу создать разреженную матрицу различий между индексами двух 1D-массивов или списков цифр. Эти две строки дают нам позиции в момент времени «а», а позднее - «b».Редкая матрица переменных перемещений (цифр) между 2 списками одинакового размера
a = [6,3,10,2,5,7,4,11,8,9]
b = [10,3,6,5,11,2,7,8,9,4]
Как вы можете видеть, '6' перешел от индекса 0 до индекса 2. '3' с индексом 1, к индексу 1. '10' из индекса 2, для индекса 0. ' 2 'от индекса 3 до индекса 5. и т. Д.
Я хочу нанести это движение на разреженную матрицу n * n. Каждая строка и столбец в порядке, начиная с 2 в соответствии с:
>>>sorted(a)
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Ниже конечный результат я хочу (разреженная матрица движения).
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 1., 0., 0., 0., 0., 0.],
[ 1., 0., 1., 0., 0., 1., 0., 0., 0., 0.]])
, который является представителем этого графа я составил:
Причем первый столбец представлен список а и второго столбца, представленного списка б.
Розовый highligher указывает движение в направлении индекса 0 (вверх). Желтый маркер указывает движение вниз. Отсутствие маркера означает отсутствие изменения положения.
Это то, что у меня есть:
>>>import numpy as np
>>>sparse = np.zeros((len(a),len(a)))
>>>sparse.shape
(10, 10)
>>>a_unique = np.unique(np.array(b), return_index=True)
>>>b_unique = np.unique(np.array(b), return_index=True)
>>>a_unique
(array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), array([3, 1, 6, 4, 0, 5, 8, 9, 2, 7]))
>>>b_unique
(array([ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), array([5, 1, 9, 3, 2, 6, 7, 8, 0, 4]))
Теперь, если мы вычитаем b_unique из a_unique, это дает нам следующее:
>>> a_unique[1]-b_unique[1]
array([-2, 0, -3, 1, -2, -1, 1, 1, 2, 3])
^Отрицательное число представляется вертикально (как столбец) в разреженной матрице в качестве позиций, присвоенных другим цифрам (то есть число переместилось вниз из списка a в список b, то есть желтый маркер).
^Положительное число представлено горизонтально (как строка) в разреженной матрице в виде позиций, полученных от других цифр (то есть число переместилось вверх из списка a в список b, то есть розовый маркер).
Я не уверен, как продолжить решение этой проблемы и, следовательно, почему мне нужна помощь.
Я понимаю общую идею того, что вы хотите сделать, но я не понимаю процесс кодирования движений элементов в вашу разреженную матрицу. Нужно ли это закодировать таким образом или вы могли бы согласиться на простую матрицу перестановок? Если вам нужна эта кодировка, можете ли вы отредактировать сообщение, чтобы просмотреть пример того, как определить один из элементов в матрице? – eigenchris
Ваш пример правильной матрицы? он кажется несоответствующим вашему примеру –
Спасибо за отзыв. Проблема решена и да, вы были правы @SaulloCastro была ошибка в исходной разреженной матрице. – user3374113