#python #arrays #numpy #file
#python #массивы #numpy #файл
Вопрос:
У меня есть код, и я хочу поместить его в цикл for . Я хочу ввести в свой код некоторые данные, хранящиеся в виде файлов, и на основе каждого ввода автоматически генерировать выходные данные. На данный момент мой код работает только для одного входного файла и, следовательно, выдает один результат. Мой входной файл назван как model000.msh
, но факт в том, что у меня есть серия этих входных файлов с именами model000.msh
, model001.msh
, и так далее. В коде я выполняю некоторые вычисления для импортированного файла и, наконец, сравниваю его с массивом numpy ( my_data
), который генерируется другим массивом numpy ( ID
), имеющим один столбец и тысячи строк. ID
array — это вторая переменная, которую я хочу перебрать. ID
выполняется с my_data
помощью np.concatenate
функции. Я хочу использовать каждый столбец ID
to make my_data
( my_data=np.concatenate((ID[:,iterator], gr), axis =1)
) . Итак, я хочу перебрать несколько файлов, затем извлечь массивы из каждого файла ( extracted
), затем выполнить цикл с генерацией my_data
из каждого столбца ID
и выполнить вычисления my_data
и extracted
, наконец, экспортировать результаты каждой итерации с помощью метода динамического именования ( changed_000
, changed_001
и так далее). Это мой код для одного единственного ввода и одного единственного my_data
массива (созданный с помощью ID
, который имеет только один столбец), но я хочу изменить итерацию по нескольким входным файлам и нескольким my_data
массивам и, наконец, несколько выходных данных:
from itertools import islice
with open('model000.msh') as lines:
nodes = np.genfromtxt(islice(lines, 0, 1000))
with open('model000.msh', "r") as f:
saved_lines = np.array([line.split() for line in f if len(line.split()) == 9])
saved_lines[saved_lines == ''] = 0.0
elem = saved_lines.astype(np.int)
# following lines extract some data from my file
extracted=np.c_[elem[:,:-4], nodes[elem[:,-4]-1, 1:], nodes[elem[:,-3]-1, 1:],nodes[elem[:,-2]-1, 1:], nodes[elem[:,-1]-1, 1:]]
…
extracted =np.concatenate((extracted, avs), axis =1) # each input file ('model000.msh') will make this numpy array
# another data set, stored as a numpy array is compared to the data extracted from the file
ID= np.array [[… ..., …, …]] # now, it is has one column, but it should have several columns and each iteration, one column will make a my_data array
my_data=np.concatenate((ID, gr), axis =1) # I think it should be something like my_data=np.concatenate((ID[:,iterator], gr), axis =1)
from scipy.spatial import distance
distances=distance.cdist(extracted [:,17:20],my_data[:,1:4])
ind_min_dis=np.argmin(distances, axis=1).reshape(-1,1)
z=np.array([])
for i in ind_min_dis:
u=my_data[i,0]
z=np.array([np.append(z,u)]).reshape(-1,1)
final_merged=np.concatenate((extracted,z), axis =1)
new_vol=final_merged[:,-1].reshape(-1,1)
new_elements=np.concatenate((elements,new_vol), axis =1)
new_elements[:,[4,-1]] = new_elements[:,[-1,4]]
# The next block is output block
chunk_size = 3
buffer = ""
i = 0
relavent_line = 0
with open('changed_00', 'a') as fout:
with open('model000.msh', 'r') as fin:
for line in fin:
if len(line.split()) == 9:
aux_string = ' '.join([str(num) for num in new_elements[relavent_line]])
buffer = '%sn' % aux_string
relavent_line = 1
else:
buffer = line
i =1
if i == chunk_size:
fout.write(buffer)
i=0
buffer = ""
if buffer:
fout.write(buffer)
i=0
buffer = ""
Я заранее признателен за любую помощь.
Ответ №1:
Я не очень уверен в вашем вопросе. Но, похоже, вы просите что-то вроде:
for idx in range(10):
with open('changed_{:0>2d}'.format(idx), 'a') as fout:
with open('model0{:0>2d}.msh'.format(idx), 'r') as fin:
#read something from fin...
#calculate something...
#write something to fout...
Если это так, вы можете выполнить поиск str.format() для получения более подробной информации.
Комментарии:
1. Уважаемый @Dipsy, спасибо за ваш отзыв. Я хочу ввести несколько файлов (
model000.msh
и так далее), извлечь некоторые данные (extracted
). Снова создайте массив (my_data
) из большего массива (ID
). Сравнитеmy_data
extracted
и экспортируйте файл (changed_00
). Мой код использует его для одного ввода и передает один вывод, но я хочу перебрать несколько входных файлов, а затем экспортировать также несколько файлов.2. Я думаю, что мой ответ может решить вашу проблему, если вы выполните точно такие же действия для каждого входного файла.
3. Дорогой @Dipsy, я действительно ценю это. Не могли бы вы, пожалуйста, подробнее рассказать об этом. Как я могу перебирать несколько входных файлов, а также генерировать несколько
my_data
из каждого столбцаID
? Спасибо, что уделили время. Я новичок в python, и мне немного сложно решать такие проблемы.4. Что касается того, как перебирать несколько входных файлов, я рассказал вам, как использовать
for
иstr.format()
открывать разные входные файлы. Что касается вашегоdata
иID
(извините, что я в замешательстве по этому поводу), я думаю, вам следует упростить свой вопрос и создать новую страницу вопросов. Мы не должны читать весь ваш код и рассказывать вам, как это исправить.5. Дорогой @Dipsy, я ценю ваши информативные подсказки. Я пытаюсь решить эту проблему, используя ваши подсказки и подсказки.