Numpy изменить: 3 начальных столбца и преобразовать его в симметричную c матрицу с третьим столбцом в качестве значений матрицы - PullRequest
0 голосов
/ 23 января 2020

У меня есть относительная проблема, я генерирую выходной файл в следующем формате:

0 0 2.419832336180e+07
3 3 1.338513645025e+05
4 3 8.296797032687e+05
9 4 1.085971011141e+03
9 0 1.168210728534e+04
6 0 3.136921649116e+07
9 8 1.947185714697e+03
6 4 2.121724871357e+07
8 1 0.000000000000e+00
1 0 0.000000000000e+00
7 1 0.000000000000e+00
7 5 -9.379278177262e+02
8 5 -1.017796490352e+03
5 2 1.701963840400e+06
10 6 6.023462888051e+06
2 2 3.024274961914e+06
10 2 1.168881211590e+06
4 0 8.609603068535e+06
4 4 6.060542386879e+06
3 0 8.597525050154e+05
5 3 3.163085402304e+05
10 3 1.616943163546e+05
9 5 1.123962851995e+03
...
...
19 10 9.044287067143e-01
19 14 4.548913530468e+00
20 6 5.226019820008e+05
19 18 9.327686301484e+04
20 10 2.425751069579e+00
20 2 1.154174282479e+05
20 14 2.125481431600e+00
20 18 3.426322700544e+03

Два первых столбца представляют индексы трехдиагональной части матрицы симметрии c, которую я хотел бы получить на numpy reshape. Например, First index "0" has only the second value "0", "1" first index "1" has "0" and "1", ...... Last first index 20 имеет индексы вторых столбцов "0","1","2" ...., "17", "18", 19", "20". Вы можете видеть, что порядок индексов является случайным.

В приведенном выше списке есть 231 строка (включая диагональ), поэтому я хотел бы построить матрицу x размера (231+231-21 = 441 = 21*21), поэтому квадрат матрица размером 21x21.

Но я также хотел бы сохранить значения в третьих столбцах в качестве значений этой матрицы, каждый из которых связан с индексом первого и второго столбца.

Как сделать эту операцию быстро с reshape numpy или другим python library? (если это возможно, в противном случае, я также буду благодарен за небольшой сценарий).

ОБНОВЛЕНИЕ 1:

Я пытался сделать:

# Select only the 2 first columns
a=np.genfromtxt('Output_file', usecols = (0,1))
# Reshape with 21x21 bloc diagonal
b=np.reshape(a,((21,21)))

но я получаю следующую ошибку:

ValueError: cannot reshape array of size 462 into shape (21,21)

Это ожидается, поскольку мне нужно выбрать только нижний или верхний диагональный блок, включая также диагональ (так как матрица симметрична c) .

Итак, в общем, если я прав, есть 21x22/2 = 231 elements to reshape, и после этого я просто "копирую" другую симметрию c часть.

Есть какие-нибудь подсказки? Привет

...