Импорт разреженной матрицы из CSV-файла

У меня есть файл csv с такими заголовками:

Учитывая, что этот test.csv файл содержит sparse matrix:

"A","B","C","D","E","F","timestamp"
611.88243,0,0,0,0,0,0
0,9089.5601,0,864.07514,0,0,0
0,0,5133.0,0,0,0,0

Я просто хочу загрузить его как разреженную матрицу/ndarray с 3 строками и 7 столбцами. Если я использую load.txt, то получаю массив с 3 строками и 7 столбцами.

numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1)

Теперь мой файл на самом деле огромен: 10 000 столбцов и 7 000 строк. Таким образом, загрузка занимает много времени. Есть ли в scipy/numpy какой-либо эффективный метод для загрузки матрицы в виде разреженной матрицы или массива, чтобы загрузка занимала меньше времени за счет использования разреженной функции?


person user2481422    schedule 26.06.2014    source источник
comment
Я сомневаюсь, что загрузка будет быстрее, если вы не используете разреженный формат для хранения матрицы.   -  person Fred Foo    schedule 26.06.2014


Ответы (1)


Я протестировал этот голый скелет loadtxt на ваших данных (реплицирован для создания массива (39,7)):

def my_loadtxt(file):
    # barebones loadtxt
    f = open(file)
    h = f.readline()
    ll = []
    for l in f:
        y = [float(x) for x in l.split(',')]
        ll.append(y)
    x = np.array(ll)
    f.close()
    return x

Это было всего в 2 раза быстрее, чем np.loadtxt.

Результат этого можно превратить в разреженную матрицу, например. sparse.csr_matrix(loadtext(...)). Но этот шаг не сэкономит время.

Вероятно, строка данных y в моей функции может быть преобразована в разреженную матрицу, а затем собрана в большую разреженную матрицу. Но для этого нужно хорошо знать типы матриц scipy.sparse. Я не настроен оптимистично по поводу экономии времени.


Если вы собираетесь загружать этот файл только один раз или редко, вам просто нужно использовать «loadtxt» или упрощенную версию и принять затраты времени. Но если вам приходится загружать его часто, возможно, стоит сохранить его в более эффективной форме.

Вы можете попробовать просто сохранить и загрузить numpy (хотя в моих тестах это медленнее).

Несколько форматов в scipy.io могут сохранять sparse матрицы. Например, формат, совместимый с matlab:

io.savemat('stack24426239.mat',{'x2':sparse.csr_matrix(x1)})
x2 = io.loadmat('stack24426239.mat')['x2']

В моих небольших тестах этот loadmat немного быстрее, чем my_loadtxt. Я не знаю, как это будет работать с гораздо большим файлом. «.mat» также немного меньше, чем «.txt».

person hpaulj    schedule 26.06.2014