Python: Как добавить (разреженный) двумерный массив на обе оси? - PullRequest
0 голосов
/ 08 ноября 2019

Мне нужно прочитать несколько двумерных матриц из плоских файлов csv, находящихся где-то в моей файловой системе, а затем сопоставить их, когда я перехожу и затем опускаюсь. Файлы csv содержат разреженные данные и позволяют предположить, что у меня есть только следующие 4 файла

file_001.csv            file_002.csv
-----------             ----------
11,0,0,0,0,11           22,0,0,0,0,22
0,0,0,0,0,0             0,0,0,0,0,0
0,0,0,0,0,0             0,0,0,0,0,0
11,0,0,0,0,11           22,0,0,0,0,22

file_003.csv            file_004.csv
-----------             ----------
33,0,0,0,0,33           44,0,0,0,0,44
0,0,0,0,0,0             0,0,0,0,0,0
0,0,0,0,0,0             0,0,0,0,0,0
33,0,0,0,0,33           44,0,0,0,0,44

В итоге я хотел бы получить следующее:

11,0,0,0,0,11,22,0,0,0,0,22
0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0
11,0,0,0,0,11,22,0,0,0,0,22
33,0,0,0,0,33,44,0,0,0,0,44
0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0
33,0,0,0,0,33,44,0,0,0,0,44

Файлы csvпоказанные выше содержат значения только в 4 углах, но в реальной жизни это не должно иметь место. Я сделал это здесь только для нашего удобства, чтобы отслеживать отдельные файлы в конечном результате.

Однако в реальной жизни данные будут редкими. Кроме того, массив в каждом CSV будет размером 2000 на 2000, и я буду склеивать 20 массивов, идущих поперек, и 23 - вниз. Следовательно, окончательный (большой разреженный) массив будет 46000 на 40000

. Я пришел к следующему. Есть ли лучший (более эффективный и / или более быстрый) способ, пожалуйста? Любые комментарии для улучшения, которые высоко ценятся.

import pandas as pd
import numpy as np
import os
from scipy.sparse import coo_matrix, hstack

def mosaic(csv_root):
    out = None
    tiles_across = 2
    tiles_down = 2
    tiles = []
    step = 0
    for j in range(tiles_down):
        # loop over the rows and for each row stitch all csvs. The keep them in a list
        csvs = [f"file_{int(i+j*tiles_across):03d}.csv" for i in range(tiles_across)]
        filenames = [os.path.join(csv_root, csv) for csv in csvs]
        df = pd.concat([pd.read_csv(f, index_col=False, header=None) for f in filenames], ignore_index=True, axis=1)
        coo = coo_matrix(df.values)
        coo.row += step
        tiles.append(coo)
        step = coo.shape[0] + step

    # concatenate now the elements of the list
    [M, N] = tiles[0].shape
    M = M * len(tiles)  # adjust the coordinates
    _row = np.concatenate([x.row for x in tiles]).ravel().tolist()
    _col = np.concatenate([x.col for x in tiles]).ravel().tolist()
    _data = np.concatenate([x.data for x in tiles]).ravel().tolist()
    out = coo_matrix((_data, (_row, _col)), shape=(M, N))
    print(out)
    return out


if __name__ == "__main__":
    my_dir = os.path.join('my', 'path', 'to', 'csv', 'root')

    mosaic(my_dir)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...