запись массивов и строк в файл с помощью оператора '%' - PullRequest
2 голосов
/ 02 мая 2019

Я пытаюсь экспортировать данные в определенный формат (файл .cube); тип файла не является основной проблемой.

Теперь мне нужно распечатать разные форматы строк в зависимости от номера строки Пока все хорошо, я могу сделать это, используя следующее:

 if line_num == 0 or line_num == 1:
     # comment line
     output_file.write("%s\n" % (self.comments[line_num]))
     continue
 if line_num == 2:
     # number of total atoms, and the origin coordinates
     output_file.write("%4d %.6f %.6f %.6f\n" % (self.num_atoms, self.origin[0], self.origin[1], self.origin[2]))
     continue

Вышеприведенная работа, но я хотел использовать оператор '%' следующим образом:

if line_num == 2:
     # number of total atoms, and the origin coordinates
     output_file.write("%4d %.6f %.6f %.6f\n" % (self.num_atoms, self.origin)

потому что self.origin - это Numpy размер массива 1X3.

При этом я получаю следующую ошибку:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only size-1 arrays can be converted to Python scalars

есть ли способ сделать то, что я хотел, вместо того, чтобы давать каждый элемент в массиве.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 02 мая 2019

Используйте *self.origin, чтобы развернуть массив.

>>> "%4d %.6f %.6f %.6f\n" % (num_atoms, *origin)
' 199 1.000000 2.000000 3.000000\n'
>>> 
1 голос
/ 02 мая 2019

В случае, если кто-то ищет эквивалент строки f, используйте следующее:

In [69]: arr = np.array([1.4556, 2.4, 3.3245])

# printing only 3 digits after the decimal point
In [70]: f'{" ".join(format(c, ".3f") for c in arr)}'
Out[70]: '1.456 2.400 3.325'

Разводная версия этого кода будет благодаря предложению NaN :

In [95]: print(("{: .3f}"*len(arr)).format(*arr))
 1.456 2.400 3.325
1 голос
/ 02 мая 2019

Проблема в том, что self.origin - это список, и вы пытаетесь распечатать список с использованием форматирования с плавающей запятой, вы можете распаковать список, используя *self.origin, и тогда он должен работать, см. Простой пример ниже.

Вы можете использовать string.format, который подходит для python2 и python3

origin = [1,2,3]
print("{:4d} {:6f} {:6f} {:6f}".format(1, *origin)) 
#   1 1.000000 2.000000 3.000000
Python 2.7.10 (default, Feb 22 2019, 21:17:52) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.37.14)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> origin = [1,2,3]
>>> print("{:4d} {:6f} {:6f} {:6f}".format(1, *origin)) 
   1 1.000000 2.000000 3.000000
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:39:00) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> origin = [1,2,3]
>>> print("{:4d} {:6f} {:6f} {:6f}".format(1, *origin))
   1 1.000000 2.000000 3.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...