我正在尝试以某种格式(.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
有一种方法可以执行我想要的操作,而不是给数组中的每个元素。
谢谢。
答案 0 :(得分:4)
使用*self.origin
展开数组。
>>> "%4d %.6f %.6f %.6f\n" % (num_atoms, *origin)
' 199 1.000000 2.000000 3.000000\n'
>>>
答案 1 :(得分:1)
问题是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
答案 2 :(得分:1)
如果有人正在寻找等效的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'
此代码的简化版本为thanks to the suggestion by NaN:
In [95]: print(("{: .3f}"*len(arr)).format(*arr))
1.456 2.400 3.325