#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