Мне нужно прочитать несколько двумерных матриц из плоских файлов 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)