我最近注意到Python的打印功能对于NumPy ndarays并不一致。例如,它水平打印一个水平的1D数组:
import numpy as np
A1=np.array([1,2,3])
print(A1)
#--> [1 2 3]
字符串
而是一个1D水平阵列,垂直方向有冗余括号:
A2=np.array([[1],[2],[3]])
print(A2)
#--> [[1]
# [2]
# [3]]
型
一维垂直阵列水平:
A3=np.array([[1,2,3]])
print(A3)
#--> [[1 2 3]]
型
一个2D数组:
B=np.array([[11,12,13],[21,22,23],[31,32,32]])
print(B)
# --> [[11 12 13]
# [21 22 23]
# [31 32 32]]
型
第一个维度现在是垂直的。对于更高的维度,情况变得更糟,因为它们都是垂直打印的:
C=np.array([[[111,112],[121,122]],[[211,212],[221,222]]])
print(C)
#--> [[[111 112]
# [121 122]]
#
# [[211 212]
# [221 222]]]
型
在我看来,一个一致的行为是水平打印偶数维,垂直打印奇数维。使用Unicode字符可以很好地格式化它。我想知道是否可以创建一个函数来打印上面的数组:
A1 --> [1 2 3]
A2 --> ┌┌─┐┌─┐┌─┐┐
│ 1 2 3 │
└└─┘└─┘└─┘┘
A3 --> ┌┌─┐┐ # \u250c\u2500\u2510
│ 1 │ # \u2502
│ 2 │
│ 3 │
└└─┘┘ # \u2514\u2500\u2518
B --> ┌┌──┐┌──┐┌──┐┐
│ 11 21 31 │
│ 12 22 32 │
│ 13 23 33 │
└└──┘└──┘└──┘┘
C --> ┌┌─────────┐┌─────────┐┐
│ [111 112] [211 212] │
│ [121 122] [221 222] │
└└─────────┘└─────────┘┘
型
我发现了这个gist,它可以处理不同的位数。我试图原型化一个递归函数来实现上面的概念:
def npprint(A):
assert isinstance(A, np.ndarray), "input of npprint must be array like"
if A.ndim==1 :
print(A)
else:
for i in range(A.shape[1]):
npprint(A[:,i])
型
它有点适用于A1
,A2
,A3
和B
,但不适用于C
。我将不胜感激,如果你能帮助我知道如何npprint
应该是实现上述输出为任意尺寸numpy ndarrays?
**P.S.1.**在Markdown中可以使用LaTeX \mathtools
\underbracket
和\overbracket
。Sympy漂亮的打印功能也是一个很好的起点。它可以使用ASCII,Unicode,LaTeX...
**P.S.2.**有人告诉我,ndarrays的打印方式确实是一致的。然而,恕我直言,这是一种有线和非直观的。拥有一个灵活的漂亮的打印功能可以帮助很多以不同的形式显示ndarrays。
**P.S.3.**Sympy的人已经考虑了我在这里提到的两点。他们的Matrix模块非常一致(A1
和A2
是相同的),他们也有一个pprint
函数,它做了同样的事情,我希望从npprint这里得到。
**P.S.4.**对于那些跟进这个想法的人,我已经在this Jupyter Notebook中集成了所有内容
2条答案
按热度按时间oxosxuxt1#
这对我来说是一个很大的启示,让我明白numpy数组并不像我想象中的MATLAB矩阵或多维数学数组。它们是同构和统一的嵌套Python列表。我还明白了numpy数组的第一维是最深/最里面的方括号对,它们是水平打印的。然后,从那里,第二维是垂直打印的,第三个垂直地用一条间隔线...
我认为有一个
ppring
函数(受Sympy命名约定的启发)会有很大的帮助。所以,我将在这里放一个非常糟糕的实现,希望它能激励其他高级Python开发者想出更好的解决方案:字符串
并且结果对于1D和2D阵列来说在某种程度上是可接受的:
型
这确实是一个非常糟糕的代码;它只适用于整数。2希望其他人能想出更好的解决方案。
P.S.1.Eric Wieser已经为IPython/Jupiter实现了一个非常好的HTML原型,可以看到here:
x1c 0d1x的数据
您可以在numpy邮件列表here上关注讨论。
**P.S.2.**我也发表了这个想法here on Reddit。
P.S.3我花了一些时间将代码扩展到3D维数组:
型
举个例子:
型
kxxlusnw2#
在每种情况下,最终尺寸的每个示例都打印在一行上,没有任何不一致的地方。
尝试各种形式的:
字符串
更改
a
中的维数(例如,通过添加更多逗号分隔的整数)。您会发现,每次打印a
时,打印对象中的每一行都将具有k
值,其中k
是a
形状中的最后一个整数。