записывать списки в виде столбцов в текстовом файле - PullRequest
0 голосов
/ 11 марта 2020

Я хотел бы написать списки в виде столбцов в текстовом файле. Я пытался сделать это так:

lst_h_names=['name_1','namenamename','nam3','4']
lst_h_1_cont=[1,2,3000,4]
lst_h_2_cont=[1,2000,3,4]
lst_scaling_factor=[10,2,3,4]
array_h_names=np.array(lst_h_names)
array_h_1_cont=np.array(lst_h_1_cont)
array_h_2_cont=np.array(lst_h_2_cont)
array_scaling_factor=np.array(lst_scaling_factor)
norm_factors=np.array([array_h_names,array_h_1_cont,array_h_2_cont,array_scaling_factor])
norm_factors=norm_factors.T
print(norm_factors)
norm_factors_path='all_factors_np.txt'
with open(norm_factors_path,'w') as fil:
    np.savetxt(fil,norm_factors,fmt=['%s','%i','%i','%i'])

Это вызывает следующую ошибку:

TypeError                                 Traceback (most recent call last)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments, encoding)
   1433                 try:
-> 1434                     v = format % tuple(row) + newline
   1435                 except TypeError:

TypeError: %i format: a number is required, not numpy.str_

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-51-5b3aeaae6c1a> in <module>
     20 norm_factors_path='all_factors_np.txt'
     21 with open(norm_factors_path,'w') as fil:
---> 22         np.savetxt(fil,norm_factors,fmt=['%s','%i','%i','%i'])

<__array_function__ internals> in savetxt(*args, **kwargs)

/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in savetxt(fname, X, fmt, delimiter, newline, header, footer, comments, encoding)
   1436                     raise TypeError("Mismatch between array dtype ('%s') and "
   1437                                     "format specifier ('%s')"
-> 1438                                     % (str(X.dtype), format))
   1439                 fh.write(v)
   1440 

TypeError: Mismatch between array dtype ('<U21') and format specifier ('%s %i %i %i')



Я понимаю, почему это не работает, но я не совсем знаю, как сделай это по-другому

Ответы [ 4 ]

1 голос
/ 11 марта 2020

Вы пытаетесь написать массив со строкой dtype:

In [11]: norm_factors                                                                          
Out[11]: 
array([['name_1', '1', '1', '10'],
       ['namenamename', '2', '2000', '2'],
       ['nam3', '3000', '3', '3'],
       ['4', '4', '4', '4']], dtype='<U21')

Как отмечают другие, только "% s" может отформатировать это.

savetxt выполняет итерации по строкам массив, форматирует и записывает его

 fmt%tuple(row)

Как отмечается в сообщении об ошибке, он преобразовал ваш fmt в ''% s% i% i% i '. Поэтому попробуйте:

 '%s %i %i %i'%tuple(norm_factors[0])

Альтернативой '% s% s% s% s' является создание массива object dtype:

In [26]: norm_factors=np.array([array_h_names,array_h_1_cont,array_h_2_cont,array_scaling_factor], dtype=object).T                                                                   
In [27]: norm_factors                                                                          
Out[27]: 
array([['name_1', 1, 1, 10],
       ['namenamename', 2, 2000, 2],
       ['nam3', 3000, 3, 3],
       ['4', 4, 4, 4]], dtype=object)
In [28]: fmt = '%s %i %i %i'                                                                   
In [29]: fmt%tuple(norm_factors[0])                                                            
Out[29]: 'name_1 1 1 10'

Вы также можете создать структурированный массив, но объект dtype проще.

И подход списков zip так же хорош.

0 голосов
/ 11 марта 2020

Вы можете использовать , что удобно:

import pandas as pd
pd.DataFrame(norm_factors).to_csv('yourfile.txt',header=None, index=None)
0 голосов
/ 11 марта 2020

Попробуйте, чтобы увидеть, работает ли он:

>>> np.savetxt(fil,norm_factors,fmt=['%s','%s','%s','%s'])

%s может обрабатывать как строковые, так и целочисленные типы в форматировании. Но, чтобы получить более точное форматирование, вы можете обратиться к приведенной ниже ссылке.

Проблема, о которой вам сообщило сообщение об ошибке, заключается в том, что вы пытаетесь представить строковый тип в виде числительного c:

TypeError: Mismatch between array dtype ('<U21') and format specifier
('%s %i %i %i')

Вот ссылка на форматирование строки:

https://docs.python.org/2/library/string.html#format -specification-mini-language

Другие ответы дают несколько полезных советов по другим аспектам вашего кода.

0 голосов
/ 11 марта 2020

Зачем вообще использовать numpy.savetxt() для этого? Родной Python поставляется со всем, что вам нужно, например,

lst_h_names = ['name_1', 'namenamename', 'nam3', '4']
lst_h_1_cont = [1, 2, 3000, 4]
lst_h_2_cont = [1, 2000, 3, 4]
lst_scaling_factor = [10, 2, 3, 4]

# combine the lists in a zip object:
l = zip(*[lst_h_names, lst_h_1_cont, lst_h_2_cont, lst_scaling_factor])
# define the format; adjust as you need
fmt = '%s, %i, %i, %i\n'

norm_factors_path = 'all_factors_np.txt'
with open(norm_factors_path, 'w') as f:
    f.writelines(fmt % row for row in l)

Если вы хотите использовать np.savetxt в любом случае , вам придется использовать другую опцию для fmt в данной пример (см. другие приведенные ответы), например,

import numpy as np
arr = np.array([lst_h_names, lst_h_1_cont, lst_h_2_cont, lst_scaling_factor]).T
# note that everything in arr is of type object, i.e. already in string format
# -> we have to use %s for np.savetext therefore:
np.savetxt(norm_factors_path, arr, fmt='%s')

Sidenote: Ваша первоначальная идея для форматирования вывода не за горами; тем не менее, вам потребуется структурированный массив в качестве входных данных. Хотя я бы не рекомендовал это для такого простого случая, как этот, вот пример:

# combine the lists and transform before creating the array:
l = list(zip(*[lst_h_names, lst_h_1_cont, lst_h_2_cont, lst_scaling_factor]))
# create a structured array from l, e.g.
arr = np.array(l, dtype=[('name', 'U10'), ('h1', 'i4'), ('h2', 'i4'), ('scl', 'i4')])

# now you can use the original formatting idea :)
norm_factors_path = 'all_factors_np.txt'
np.savetxt(norm_factors_path, arr, fmt=['%s','%i','%i','%i'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...