Замена "."с "," при использовании numpy для записи десятичных чисел в файл - PullRequest
0 голосов
/ 12 мая 2019

Попытка заменить "."с "," в файле, который я использую для записи numpy, но мне удалось только уменьшить целые числа.Как мне это сделать?

np.savetxt("C:\\Users\\jcst\\Desktop\\Private\\Python data\\train22.csv", ('%15.1f' % predicted_factor).replace(".", ","), delimiter=',')

Traceback (последний вызов был последним): файл "C: /Users/jcst/PycharmProjects/Frafaldsanalyse/DefiningCatAndNumFeatures_4.py", строка 165, в np.savetxt ("C: \ Users \ jcst \ Desktop \ Private \ Python data \ train22.csv", ('% 15.1f' %realted_factor) .replace (".", ","), delimiter = ',') TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python

1 Ответ

0 голосов
/ 12 мая 2019

Обычная запись с плавающей запятой с savetxt:

In [44]: arr = np.arange(0,6,.34).reshape(6,3) 
In [51]: np.savetxt('test.txt',arr, fmt='%10.3f', delimiter=',')                
In [52]: cat test.txt                                                           
     0.000,     0.340,     0.680
     1.020,     1.360,     1.700
     2.040,     2.380,     2.720
     3.060,     3.400,     3.740
     4.080,     4.420,     4.760
     5.100,     5.440,     5.780

Редактирование этого файла после создания, замена сначала разделителя, а затем десятичной точки, является одним из вариантов.

locale

С помощью модуля locale можно изменить десятичную точку на запятую (я полагаю, это то, что вы пытаетесь сделать с replace).Но я не могу найти способ использовать это напрямую со стилем форматирования %, который используется savetxt.

locale.setlocale (LC_NUMERIC): как заставить его работать в Windows

Но возможно использовать эту локализацию с более новым стилем format, используя 'n' . So rewriting savetxt to use format`:

In [98]: fmt = '{:10.3n}'                                                       
In [99]: fmts = ';'.join([fmt]*3)+'\n'                                          
In [100]: fmts                                                                  
Out[100]: '{:10.3n};{:10.3n};{:10.3n}\n'
In [101]: with open('test1.txt','w') as f: 
     ...:     for row in arr: 
     ...:         f.write(fmts.format(*row)) 
     ...:                                                                       
In [102]: cat test1.txt                                                         
         0;      0,34;      0,68
      1,02;      1,36;       1,7
      2,04;      2,38;      2,72
      3,06;       3,4;      3,74
      4,08;      4,42;      4,76
       5,1;      5,44;      5,78

Ранее в сеансеЯ бы сделал

import locale    
locale.setlocale(locale.LC_NUMERIC, 'en_DK.utf8') 

Я не знаком с locale, но этого оказалось достаточно.У меня нет специальных пакетов locale, установленных в моей системе.

чтение

Остерегайтесь того, что np.genfromtxt потребуется преобразователь (для возврата запятой на точку).

In [145]: foo = lambda astr: float(astr.replace(b',',b'.'))                     
In [146]: np.genfromtxt('test1.txt',delimiter=';',converters={i:foo for i in ran
     ...: ge(3)})                                                               
Out[146]: 
array([[0.  , 0.34, 0.68],
       [1.02, 1.36, 1.7 ],
       [2.04, 2.38, 2.72],
       [3.06, 3.4 , 3.74],
       [4.08, 4.42, 4.76],
       [5.1 , 5.44, 5.78]])

pandas

pandas, хотя имеет параметр decimal:

In [133]: df = pd.read_csv('test1.txt',sep=';',decimal=',',header=None)         
In [134]: df                                                                    
Out[134]: 
      0     1     2
0  0.00  0.34  0.68
1  1.02  1.36  1.70
2  2.04  2.38  2.72
3  3.06  3.40  3.74
4  4.08  4.42  4.76
5  5.10  5.44  5.78

Модуль записи pandas csv также принимает параметр decimal.

Может быть, я должен был посмотреть на pandas прямо сейчас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...