Я новичок в python и хочу наиболее питонический способ решения следующей основной проблемы:
У меня есть много файлов данных с открытым текстом file.00001
, file.00002
,..., file.99999
, и каждый файл имеет одну строку с числовыми данными, хранящимися, например. четыре колонки. Я хочу читать каждый файл последовательно и добавлять данные в один массив для каждого столбца, поэтому в конце концов мне нужны массивы arr0
, arr1
, arr2
, arr3
, каждый из которых shape=(99999,)
содержит все данные из соответствующего столбца во всех файлах.
Позже я хочу проделать много математических операций с этими массивами, поэтому мне нужно убедиться, что их записи непрерывны в памяти. Мое наивное решение:
import numpy as np
fnumber = 99999
fnums = np.arange(1, fnumber+1)
arr0 = np.full_like(fnums, np.nan, dtype=np.double)
arr1 = np.full_like(fnums, np.nan, dtype=np.double)
arr2 = np.full_like(fnums, np.nan, dtype=np.double)
arr3 = np.full_like(fnums, np.nan, dtype=np.double)
# ...also is there a neat way of doing this??
for fnum in fnums:
fname = f'path/to/data/folder/file.{fnum:05}'
arr0[fnum-1], arr1[fnum-1], arr2[fnum-1], arr3[fnum-1] = np.loadtxt(fname, delimiter=' ', unpack=True)
# error checking - in case a file got deleted or something
all_arrs = (arr0, arr1, arr2, arr3)
if np.isnan(all_arrs).any():
print("CUIDADO HAY NANS!!!!\nLOOK OUT, THERE ARE NANS!!!!")
Меня поражает, что это очень C-мышление, и, вероятно, есть более питонический способ сделать это. Но мне кажется, что такие методы, как numpy.concatenate
и numpy.insert
, либо не приведут к созданию массивов с непрерывным содержимым в памяти, либо задействуют глубокие копии каждого массива на каждом этапе цикла for, что, вероятно, расплавит мой ноутбук.
Есть ли более питонический способ?
all_arrs
— это кортеж массивов.np.isnan
превратит это в один массив (например,np.array(all_arrs)
, вернув логический массив формы (4,100000?). - person hpaulj   schedule 05.11.2020