虽然有一些问题和答案接近我正在寻找的东西,但我想知道这个特定问题是否没有更优雅的解决方案:我有一个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?
答案 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]