У меня есть относительная проблема, я генерирую выходной файл в следующем формате:
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 часть.
Есть какие-нибудь подсказки? Привет