Я уже искал на сайте, но не нашел ничего конкретного для моего случая. У меня есть код, который создает массив из текстового файла, и я просто хочу создать новый файл, такой как входной, но с новым массивом, добавленным в столбце справа. Как я могу сделать?

Пример входного файла:

4.00171 2.04336E14 14.31034 0.65049
2.56491 6.89220E13 13.83835 1.05022
1.95019 3.45559E13 13.53852 1.38901

Часть кода, которая создает массив:

import numpy as np

dataset = np.genfromtxt(fname='input.dat') 
s=dataset[:,3]
d=1.686/s

И я просто хочу добавить массив d в столбец справа от входного файла и сохранить все в новом выходном файле. (Я использую Python 2.7).

1
Alessandro Peca 29 Авг 2017 в 14:12

4 ответа

Лучший ответ

Почему бы не сделать concatenate вдоль правильной оси?

Проблема в том, что ваши переменные d и s имеют форму (3,) и, таким образом, являются скорее вектором, чем массивом. Следующее решает проблему:

s=dataset[:,3]
d=1.686/s
d=d[:,None]
output = np.concatenate((dataset,d), axis=1)

Теперь вам просто нужно вывести свои данные обратно в файл, и все готово ...

np.savetxt('example.txt', output)

1
plinius_prem 29 Авг 2017 в 11:37

С функциями numpy.append и numpy.savetxt:

dataset = np.genfromtxt('input.dat')
d = 1.686/dataset[:,3]
d = np.reshape(d, (dataset.shape[0],1))   # adjust dimension of the new array
result = np.append(dataset, d, 1)         # append as last column
np.savetxt('output.txt', result, delimiter=" ", fmt="%s")

output.txt содержимое будет выглядеть так:

4.00171 2.04336e+14 14.31034 0.65049 2.59189226583
2.56491 6.8922e+13 13.83835 1.05022 1.60537792082
1.95019 3.45559e+13 13.53852 1.38901 1.21381415541
2
RomanPerekhrest 29 Авг 2017 в 14:53

Чтобы открыть файл и сохранить его как другой, вы должны использовать with open.

Попробуй это:

import os
# dirpath is the path to your file
# file is the name of your file with extension
# Read the file and store it in a variable
with open(os.path.join(dirpath, file), 'r') as f:
    filedata = f.read()

# Manipulate your filedata here

# Write the file out again to a new file
with open(os.path.join(dirpath, new_file), 'w') as f:
    f.write(filedata)

Если вам нужен хороший способ манипулировать вашими данными, я бы предложил использовать библиотеку Pandas

Полный пример с использованием Pandas:

import pandas as pd
import numpy as np
dirpath = r'C:\Users\eandrade_brp\Desktop'
file = 'input_example'
new_file = 'new.data'

dataset = np.genfromtxt(fname=os.path.join(dirpath, file))
s = dataset[:, 3]
d = 1.686 / s

df = pd.DataFrame(dataset)    # Create DataFrame from matrix
df['4'] = d   # Add new column

# Save it to a new file without head, index and with white space separator
df.to_csv(os.path.join(dirpath, new_file), header = False, index=False,  sep=' ')   
0
Eduardo 29 Авг 2017 в 11:52

Считайте файл в массив строк, разделив символ новой строки. Цикл по линиям. После записи каждой строки в новый файл добавьте следующий элемент массива «d» (плюс символ новой строки).

0
Mike 29 Авг 2017 в 11:23