Печать чисел с плавающей точкой и целых чисел в файл с заданным форматом в python - PullRequest
0 голосов
/ 18 марта 2020

У меня есть этот простой код:

import numpy as np
from numpy import random
import csv
import os
import pandas as pd

data=np.loadtxt('lums.dat')
data2=np.loadtxt('all.dat')

shuffle=np.random.shuffle(data[0::1])

with open('data', 'w') as f:
 writer = csv.writer(f, delimiter=" ")
 writer.writerows(zip(data2[:,0], data2[:,1], data[:,0], data[:,1], data2[:,4], data2[:,5]))

Вывод выглядит следующим образом:

42.9356886 1.0 30.91534 1.0 0.899 1.0
43.6177968 1.0 30.76019 1.0 1.5 1.0
42.6341244 1.0 29.26717 0.0 0.61 1.0

Однако мне нужно, чтобы второй, четвертый и шестой столбцы были целыми числами, и я Также нужно иметь возможность указать количество цифр в первом, третьем и пятом столбцах. Есть ли простой способ сделать это?

Редактировать: файл lums.dat содержит:

31.2114100 1
33.0060900 1
31.1879700 1
31.1502300 1
30.0178600 1
29.8382100 1

Файл all.dat содержит:

42.9356886 1  31.2114100 1  0.89900000 1
43.6177968 1  33.0060900 1  1.50000000 1
42.6341244 1  31.1879700 1  0.61000000 1
42.5828698 1  31.1502300 1  0.69700000 1
42.2789821 1  30.0178600 1  0.26000000 1
41.9161537 1  29.8382100 1  0.21400000 1

Ответы [ 2 ]

0 голосов
/ 18 марта 2020
In [32]: txt="""42.9356886 1  31.2114100 1  0.89900000 1 
    ...: 43.6177968 1  33.0060900 1  1.50000000 1 
    ...: 42.6341244 1  31.1879700 1  0.61000000 1"""                                                                 
In [33]: data = np.loadtxt(txt.splitlines())                                                                         
In [34]: data                                                                                                        
Out[34]: 
array([[42.9356886,  1.       , 31.21141  ,  1.       ,  0.899    ,
         1.       ],
       [43.6177968,  1.       , 33.00609  ,  1.       ,  1.5      ,
         1.       ],
       [42.6341244,  1.       , 31.18797  ,  1.       ,  0.61     ,
         1.       ]])

Запишите его в файл с указанным форматом:

In [37]: np.savetxt('test.csv', data, fmt='%.7f %d %.7f %d %.7f %d')                                                 
In [38]: cat test.csv                                                                                                
42.9356886 1 31.2114100 1 0.8990000 1
43.6177968 1 33.0060900 1 1.5000000 1
42.6341244 1 31.1879700 1 0.6100000 1
0 голосов
/ 18 марта 2020

Проблема в том, что вы не можете изменить тип на int, потому что число по-прежнему является массивом, поэтому я использовал dtype. Он предназначен для управления типом внутри np.array. То же самое работает для округления чисел, когда вы должны использовать функцию numpy np.round по той же причине.

Если вы не хотите использовать функцию numpy, сначала вы должны измените переменную из массива на число.

Для форматирования указанного номера c в python есть метод %. Для указания номера di git вы используете %.6f для 6 цифр. В вашем случае вы сначала должны обработать формат вашего массива, что я и сделал с помощью операции со списком.

import numpy as np
import csv

data = np.loadtxt('lums.dat')
data2 = np.loadtxt('all.dat')

shuffle = np.random.shuffle(data[0::1])

with open('data', 'w') as f:
    writer = csv.writer(f, delimiter=" ")
    writer.writerows(zip(np.round(data2[:, 0], 2), np.array(data2[:, 1], dtype=int), np.round(data[:, 0], 2), np.array(data[:, 1], dtype=int), (np.array(["%.8f" % i for i in data2[:, 4]])), np.array(data2[:, 5], dtype=int)))
...