Хранение верхней / нижней половины корреляционной матрицы - PullRequest
1 голос
/ 20 марта 2019

Каков самый {(1) эффективный по памяти (2) эффективный по времени (3) простой доступ *} способ для сохранения верхней / нижней половины матрицы корреляции в файле в python ?
(Под «легким доступом» я имею в виду возможность чтения из файла и построения матрицы корреляции с помощью matplotlib / seaborn) Пример для приведенной ниже матрицы корреляции:

    C1   C2   C3   C4
C1  1.0  0.6  0.7  0.5  
C2  0.6  1.0  0.4  0.9  
C3  0.7  0.4  1.0  0.3
C4  0.5  0.9  0.3  1.0

Я хочу сохранить указанные ниже числа в файле.

    C2   C3   C4
C1  0.6  0.7  0.5
C2       0.4  0.9
C3            0.3

ИЛИ

    C1   C2   C3  
C2  0.6
C3  0.7  0.4
C4  0.5  0.9  0.3

(я думал о сохранении его в виде файла csv / tsvно он все равно будет поглощать память для пустых символов, которые будут там для другой половины матрицы.)

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Используйте второе представление. Это просто транспонирование первого, и вам не нужно хранить пустые символы для второй половины. Если вас интересуют пробелы в символах, напишите пользовательскую программу записи / чтения файлов для вашей матрицы.

Пример:

mat = []

mat.append(["C1", "C2", "C3"])
mat.append(["C2", 0.6])
mat.append(["C3", 0.7, 0.4])
mat.append(["C4", 0.5, 0.9, 0.3])

print(mat)

with open("correlation.txt", "w") as _file:
    for row in mat:
        _file.write("\t".join(str(val) for val in row))
        _file.write("\n") # you will not have blank characters

with open("correlation.txt", "r") as _file:
    for line in _file.readlines():
        print(len(line.split()))

Результат:

[['C1', 'C2', 'C3'], ['C2', 0,6], ['C3', 0,7, 0,4], ['C4', 0,5, 0,9, 0,3]]
3 * * +1010 2
3
4

1 голос
/ 20 марта 2019

Вам нужно что-то вроде этого:

matrix = np.array([[1, 0.6, 0.7, 0.5],
          [0.6, 1, 0.4, 0.9],
          [0.7, 0.4, 1, 0.3],
          [0.5, 0.9, 0.3, 1]])

ut = np.triu(matrix, k=1)
lt = np.tril(matrix, k=-1)

ut = np.where(ut==0, np.nan, ut)
lt = np.where(lt==0, np.nan, lt)

np.savetxt("upper.csv", ut, delimiter=",")
np.savetxt("lower.csv", lt, delimiter=",")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...