squareform
делает все это. Прочтите документы и поэкспериментируйте. Он работает в обоих направлениях. Если вы дадите ему матрицу, она вернет значения верхнего треугольника (сгущенная форма). Если вы дадите ему эти значения, он вернет матрицу.
In [668]: M
Out[668]:
array([[ 0. , 0.1, 0.5, 0.2],
[ 0.1, 0. , 2. , 0.3],
[ 0.5, 2. , 0. , 0.2],
[ 0.2, 0.3, 0.2, 0. ]])
In [669]: spatial.distance.squareform(M)
Out[669]: array([ 0.1, 0.5, 0.2, 2. , 0.3, 0.2])
In [670]: v=spatial.distance.squareform(M)
In [671]: v
Out[671]: array([ 0.1, 0.5, 0.2, 2. , 0.3, 0.2])
In [672]: spatial.distance.squareform(v)
Out[672]:
array([[ 0. , 0.1, 0.5, 0.2],
[ 0.1, 0. , 2. , 0.3],
[ 0.5, 2. , 0. , 0.2],
[ 0.2, 0.3, 0.2, 0. ]])
Вы также можете указать force
и checks
параметр, но без тех, кого он просто идет по форме.
Indicies может исходить от triu
In [677]: np.triu_indices(4,1)
Out[677]:
(array([0, 0, 0, 1, 1, 2], dtype=int32),
array([1, 2, 3, 2, 3, 3], dtype=int32))
In [680]: np.vstack((np.triu_indices(4,1),v)).T
Out[680]:
array([[ 0. , 1. , 0.1],
[ 0. , 2. , 0.5],
[ 0. , 3. , 0.2],
[ 1. , 2. , 2. ],
[ 1. , 3. , 0.3],
[ 2. , 3. , 0.2]])
Просто, чтобы проверить, можно заполнить матрицу 4x4 с этими значениями
In [686]: A=np.vstack((np.triu_indices(4,1),v)).T
In [687]: MM = np.zeros((4,4))
In [688]: MM[A[:,0].astype(int),A[:,1].astype(int)]=A[:,2]
In [689]: MM
Out[689]:
array([[ 0. , 0.1, 0.5, 0.2],
[ 0. , 0. , 2. , 0.3],
[ 0. , 0. , 0. , 0.2],
[ 0. , 0. , 0. , 0. ]])
Эти triu
индексы также могут получать значения из M
:
In [693]: I,J = np.triu_indices(4,1)
In [694]: M[I,J]
Out[694]: array([ 0.1, 0.5, 0.2, 2. , 0.3, 0.2])
squareform
использует скомпилированный код в spatial.distance._distance_wrap
, поэтому я ожидаю, что он будет довольно быстрым для больших массивов. Только проблема только возвращает значения сконденсированной формы, но не индексы. Но, учитывая форму, индексы всегда можно вычислить. Их не нужно хранить со значениями.
Ответ на все ваши вопросы утвердительный. Да, это все возможно. Начать работать. – DyZ
lol Я получил его, но он медленный. У меня есть матрица размером 76800 x 3900. Было просто видно, была ли быстрая реализация, но я думаю, что у Джона было хорошее предложение попробовать это –