Сохранение верхней / нижней половины корреляционной матрицы

#python #matrix

#python #матрица

Вопрос:

Какой самый {(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, но он все равно будет занимать память для пустых символов, которые будут там для другой половины матрицы.)

Комментарии:

1. Итак, ваша матрица — это list или numpy array ?

2. Используйте второе представление. В этом случае вам не нужны пробелы.

3. @AkshayNevrekar это в виде списка списков, но может быть преобразовано в np-массив.

4. @HariUserX извините за правку, я хочу сохранить имена столбцов также вместе со значениями.

5.Numpy имеет tri и triu docs.scipy.org/doc/numpy-1.13.0/reference/generated /…

Ответ №1:

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

 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=",")
  

Комментарии:

1. Да, сохранение его в формате CSV уже было для меня вариантом. Цель этого вопроса — спросить, как предотвратить появление ненужных нулей в матрице.

2. это должно быть np.savetxt

3. @flyingDope Я преобразовал 0 в nan. Написание этого как .txt может помочь

4. О, да, NaNs действительно уменьшил размер csv-файла. Спасибо!

Ответ №2:

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

Пример:

 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
2
3
4