在python中打印一个二维数组
Posted
技术标签:
【中文标题】在python中打印一个二维数组【英文标题】:printing a two dimensional array in python 【发布时间】:2013-07-26 02:08:49 【问题描述】:我必须在一个 5x5 数组中打印这个 python 代码,这个数组应该是这样的:
0 1 4 (infinity) 3
1 0 2 (infinity) 4
4 2 0 1 5
(inf)(inf) 1 0 3
3 4 5 3 0
谁能帮我打印这张表?使用索引。
for k in range(n):
for i in range(n):
for j in range(n):
if A[i][k]+A[k][j]<A[i][j]:
A[i][j]=A[i][k]+A[k][j]
【问题讨论】:
您是否有意在两个嵌套循环中使用j
作为递增变量?
控制数组中每个项目值的数学公式是什么?
感谢您发现我的错误。我的意思是我用“我”
【参考方案1】:
我使用 numpy 生成数组,但列表数组的列表应该类似地工作。
import numpy as np
def printArray(args):
print "\t".join(args)
n = 10
Array = np.zeros(shape=(n,n)).astype('int')
for row in Array:
printArray([str(x) for x in row])
如果您只想打印某些索引:
import numpy as np
def printArray(args):
print "\t".join(args)
n = 10
Array = np.zeros(shape=(n,n)).astype('int')
i_indices = [1,2,3]
j_indices = [2,3,4]
for i in i_indices:printArray([str(Array[i][j]) for j in j_indices])
【讨论】:
有没有办法使用索引? 我不确定这是解决这个特定问题的最佳解决方案(因为它不专门处理数组结构),但您也可以执行以下操作:def print_join(*args): print "\t".join(str(arg) for arg in args)
。然后它将扩展到任意数量的参数,而不是固定为 5。【参考方案2】:
list comprehensions 和 str
joins 的组合可以完成这项工作:
inf = float('inf')
A = [[0,1,4,inf,3],
[1,0,2,inf,4],
[4,2,0,1,5],
[inf,inf,1,0,3],
[3,4,5,3,0]]
print('\n'.join([''.join([':4'.format(item) for item in row])
for row in A]))
产量
0 1 4 inf 3
1 0 2 inf 4
4 2 0 1 5
inf inf 1 0 3
3 4 5 3 0
在 Python 中使用 for-loops 和索引通常是可以避免的,并且不被认为是“Pythonic”,因为它的可读性不如它的 Pythonic 表亲(见下文)。但是,您可以这样做:
for i in range(n):
for j in range(n):
print ':4'.format(A[i][j]),
print
更 Pythonic 的表弟是:
for row in A:
for val in row:
print ':4'.format(val),
print
但是,这使用了 30 个打印语句,而我的原始答案只使用了一个。
【讨论】:
我需要能够使用给定的 for 循环。有谁知道如何做到这一点?我想将更大的 for 循环合并到我正在处理的程序中,但我想使用索引。 内联连接与可迭代项的字符串格式配对是非常漂亮的pythonic。按照计算方式读取,该语句在数组 [row
] 中创建了一个格式精美的字符串 ':4'.format
for
[each]` 项。这些字符串被放入一个数组(语句被[]
包围),然后是''.join
的参数。然后,每条漂亮的线都是'\n'.join'ed
请注意,可以使用生成器推导而不是列表推导来保存 2 对方括号:print('\n'.join(''.join(':4'.format(item) for item in row) for row in matrix))
。此外,如果不希望第一列以空格为前缀,则可以使用 print('\n'.join(' '.join(':3'.format(item) for item in row) for row in matrix))
。【参考方案3】:
使用索引、for 循环和格式化:
import numpy as np
def printMatrix(a):
print "Matrix["+("%d" %a.shape[0])+"]["+("%d" %a.shape[1])+"]"
rows = a.shape[0]
cols = a.shape[1]
for i in range(0,rows):
for j in range(0,cols):
print "%6.f" %a[i,j],
print
print
def printMatrixE(a):
print "Matrix["+("%d" %a.shape[0])+"]["+("%d" %a.shape[1])+"]"
rows = a.shape[0]
cols = a.shape[1]
for i in range(0,rows):
for j in range(0,cols):
print("%6.3f" %a[i,j]),
print
print
inf = float('inf')
A = np.array( [[0,1.,4.,inf,3],
[1,0,2,inf,4],
[4,2,0,1,5],
[inf,inf,1,0,3],
[3,4,5,3,0]])
printMatrix(A)
printMatrixE(A)
产生输出:
Matrix[5][5]
0 1 4 inf 3
1 0 2 inf 4
4 2 0 1 5
inf inf 1 0 3
3 4 5 3 0
Matrix[5][5]
0.000 1.000 4.000 inf 3.000
1.000 0.000 2.000 inf 4.000
4.000 2.000 0.000 1.000 5.000
inf inf 1.000 0.000 3.000
3.000 4.000 5.000 3.000 0.000
【讨论】:
【参考方案4】:总有简单的方法。
import numpy as np
print(np.matrix(A))
【讨论】:
迄今为止最好的答案,我们不要重新发明*** 矩阵不是*** 这不是一个好的答案,如果你有一个包含大量浮点列的矩阵,它会完全弄乱显示 我怎样才能让它为一个大的矩阵打印整个矩阵,例如大小(300、300)? 无论如何,您都无法在屏幕上放置 300x300 矩阵。尝试将其转储到 CSV 文件中。 ***.com/questions/6081008/…【参考方案5】:print(mat.__str__())
其中 mat 是指您的矩阵对象的变量
【讨论】:
有什么理由调用私有方法而不是str(mat)
?【参考方案6】:
除了简单的打印答案之外,您实际上还可以通过使用numpy.set_printoptions函数来自定义打印输出。
先决条件:
>>> import numpy as np
>>> inf = np.float('inf')
>>> A = np.array([[0,1,4,inf,3],[1,0,2,inf,4],[4,2,0,1,5],[inf,inf,1,0,3],[3,4,5,3,0]])
以下选项:
>>> np.set_printoptions(infstr="(infinity)")
结果:
>>> print(A)
[[ 0. 1. 4. (infinity) 3.]
[ 1. 0. 2. (infinity) 4.]
[ 4. 2. 0. 1. 5.]
[(infinity) (infinity) 1. 0. 3.]
[ 3. 4. 5. 3. 0.]]
以下选项:
>>> np.set_printoptions(formatter='float': "\t: 0.0f\t".format)
结果:
>>> print(A)
[[ 0 1 4 inf 3 ]
[ 1 0 2 inf 4 ]
[ 4 2 0 1 5 ]
[ inf inf 1 0 3 ]
[ 3 4 5 3 0 ]]
如果你只想为特定的数组输出特定的字符串,函数numpy.array2string也可用。
【讨论】:
【参考方案7】:for i in A:
print('\t'.join(map(str, i)))
【讨论】:
以上是关于在python中打印一个二维数组的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )