В основном это касается массивов Numpy, но я считаю, что это общая проблема дизайна. Во многих случаях у меня возникает следующая общая проблема в научных вычислениях: мне нужно прочитать набор данных, состоящий из нескольких временных экземпляров определенного векторного поля, например. изменяющееся во времени поле скоростей в ряде точек. Что-то, что может быть трехмерным массивом размеров (Npoints, 3, Ntimesteps) (3, потому что у меня есть три компонента вектора). Обычно у меня был бы один файл на каждый такт, поэтому мне пришлось бы читать файлы Ntimesteps, но я заранее не знаю размер каждого поля (т. е. я не знаю заранее Npoints, но это одинаково для каждого файла). Если я хочу предварительно выделить массив Numpy для хранения этих данных, я привык делать что-то вроде этого:
Код: Выделить всё
tsteps = list(glob.glob('time*.csv'))
Nsteps = len(tsteps)
with open(tsteps[0], 'r') as f:
# do my work to get Npoints and the data of the first file
dataset = np.zeros(Npoints, 3, Nsteps)
dataset[:,:,0] = data_first_file
for i,f in enumerate(tsteps[1:]):
# do my work again
dataset[:,:,i] = data_from_tstep_i
Однако это выглядит не очень «элегантно», поскольку мне приходится дважды писать код для обработки каждого файла временных шагов: один раз для предварительного выделения массива и один раз в цикле. Есть ли более элегантный способ сделать это?
Подробнее здесь:
https://stackoverflow.com/questions/792 ... umpy-array