Python 3.x 使用不同的分隔符从结构化numpy数组写入行

Python 3.x 使用不同的分隔符从结构化numpy数组写入行,python-3.x,numpy,Python 3.x,Numpy,我有一些数据存储在一个结构化的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 现在,我知道我

我有一些数据存储在一个结构化的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),有没有更通用的语句可以用来“汇总”所有列?我在考虑打印(“%I%.2f%s”%val代表行中的val)但是这只打印了2个生成器。当我在使用
re.split
时遇到一个生成器时,我可以使用
list()
来获得我想要的输出,但我不认为在这种情况下使用类似于
str()
的东西会满足我的要求。

首先: 关于你对发电机的隐含问题; 例如,您可以使用
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='')

它只是对每种格式提供了更好的概述。

如果将
包装成
元组
,则不必列出所有元素<代码>%格式采用
元组
<代码>行可能显示为
元组
,但实际上是
numpy.void

for row in x:
    print('%i %.2f   %s'%tuple(row))
像这样在循环中打印或写入行是非常正常的Python

\uuuu str\uuuu
方法通常编写如下:

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中使用的样式。

您能否详细说明
可变空格分隔符
的外观?空白的数量遵循哪些规则?@cel没有规则,但是我在格式字符串中指定了它。如果空白的数量完全是任意的,并且不遵循任何模式,您可能无法比手动指定格式字符串做得更好。如果切换到
string.format
至少可以将格式化与元组解包结合起来:
{}{.2f}{}.format(*rows)
。谢谢,这正是我要找的!感谢你的背景信息:)谢谢你的信息!这是可行的,但另一个答案是我一直在寻找的。