在python中打印格式化列表和索引值的优雅方式?

时间:2013-09-07 20:07:47

标签: python numpy formatting pretty-print

虽然有一些问题和答案接近我正在寻找的东西,但我想知道这个特定问题是否没有更优雅的解决方案:我有一个numpy(2D)阵列并且想要将它与行号一起逐行打印 - 当然还有很好的格式化。

此代码执行打印,直接但没有格式化:

import numpy as np
A = np.zeros((2,3))
for i in range(2):
    print i, A[i]

我还可以通过在每行中重新构建格式化字符串来生成格式化输出:

for i in range(2):
    print "%4i "%(i)+" ".join(["%6.2f"%(v) for v in A[i]])

虽然这有效,但我认为它可能更具可读性,也许更有效率(?)只构建一次格式字符串,然后“粘贴”每行的数字:

NVAR=A.shape[1]
fmt = "%4i" + NVAR*"  %6.2f"
for i in range(2):
    print fmt % (i, A[i])

这失败了,因为格式化的打印需要一个带浮点元素的元组,但A [i]是一个ndarray。因此,我的问题实际上归结为“如何用整数值和1-D ndarray形成元组?”。我试过了:

    tuple( [i].extend([v for v in A[i]]) )

但是这不起作用(即使[v for v in A[i]]正常工作,此表达式也会产生无。)

或者我在这里仍然只是想着FORTRAN?

3 个答案:

答案 0 :(得分:1)

您可以先将numpy数组转换为tolist()的列表。

for i in range(2):
    print fmt % tuple([i] + A[i].tolist())

出错的原因是扩展列表不会产生返回值。

>>> x = range(5)
>>> x.extend([5, 6])
>>> x
[0, 1, 2, 3, 4, 5, 6]

+运算符用于连接列表。

答案 1 :(得分:1)

您可以使用tuple构造函数将数组元素直接转换为元组:

for i in range(2):
    print fmt % ((i, ) + tuple(A[i]))

此处,+表示元组连接。

另外,如果你来自FORTRAN,你可能还不知道enumerate,这对于这种类型的循环操作很方便:

for i, a in enumerate(A):
    print fmt % ((i, ) + tuple(a))

您可以将其与itertools.chain结合使用来展平枚举对

import itertools

for i, a in enumerate(A):
    print fmt % tuple(itertools.chain((i, ), a))

对于你在这里尝试做的事情来说,这些都可能有些过分,但我只想展示一些其他方法。

答案 2 :(得分:0)

这是一个简单的解决方案:

import numpy as np
A = np.random.rand(200,3)
for i in xrange(98, 102):
    print '{0:4d} {1}'.format(i, A[i]) #'4d' reserves space for 4 digits
                                       # Modify to the maximum # of rows

输出如下:

  98 [ 0.40745341  0.29954899  0.21880649]
  99 [ 0.23325155  0.81340095  0.57966024]
 100 [ 0.24145552  0.12387366  0.0384011 ]
 101 [ 0.76432552  0.68382022  0.93935336]