我有一些数据存储在一个结构化的numpy数组中,我想写一个文件。因为我正在生成一些代码以匹配导出视觉上更令人愉悦的表的现有输出格式,所以我需要使用不同的空格分隔符输出此数据。
使用基本示例:
import numpy as np
x = np.zeros((2,),dtype=('i4,f4,a10'))
x[:] = [(1,2.,'Hello'),(2,3.,'World')]
具有所需的输出:
1 2.00 Hello
2 3.00 World
现在,我知道我可以这样做:
for row in x:
print('%i %.2f %s' % (row[0], row[1], row[2]))
哪个工作正常,但如果你有很多专栏,它似乎过于冗长。现在我的输出中有8个。
我是Python的新手(来自MATLAB),是否有一个更通用的语句可以用来“汇总”所有列?我正在考虑print('%i %.2f %s' % val for val in row)
的问题,但这只是打印出两台发电机。当我在使用re.split
时遇到一个生成器时,我可以使用list()
来获得我想要的输出,但我不认为使用类似的东西,例如,str()
这个案例会做我正在寻找什么。
答案 0 :(得分:1)
<强>首先:强>
关于你对发电机的隐含问题;
你可以&#34; stringify&#34;一个生成器,例如str.join
:
>>> gen = (i.upper() for i in "teststring")
>>> print(''.join(gen))
TESTSTRING
<强>第二强> 对于实际问题:它比你的方法更通用,但它仍然不能令人满意。
formats = [
("{}", 1), # format and number of spaces for row[0]
("{.2f}", 4), # the same for row[1]
("{}", 0) # and row[2]
]
for row in x:
lst = [f.format(d) + (" "*s) for (f, s, d) in zip(formats, row)]
print(*lst, sep='')
它只是提供了对每种格式的更好的概述。
答案 1 :(得分:1)
如果将row
包裹在tuple
中,则无需列出所有元素。 %
格式需要tuple
。 row
可能会显示为tuple
,但实际上是numpy.void
。
for row in x:
print('%i %.2f %s'%tuple(row))
在这样的循环中打印或写行是完全正常的Python。
类__str__
方法通常写成:
astr=['a header line']
for row in x:
astr.append('%i %.2f %s'%tuple(row))
astr='\n'.join(astr)
生成一串连接线。
理解相当于:
'\n'.join('%i %.2f %s'%tuple(row) for row in x)
由于您使用的是Python3,因此您也可以使用.format
方法,但我怀疑%
样式更接近您在MATLAB中使用的样式。