我最近注意到Python打印功能对于numpyndaray是不一致的。例如,它水平打印水平1D数组:
import numpy as np
A1=np.array([1,2,3])
print(A1)
#--> [1 2 3]
但是一个1D水平阵列,垂直方向有冗余的支架:
^{pr2}$水平一维垂直阵列:
A3=np.array([[1,2,3]])
print(A3)
#--> [[1 2 3]]
以及一个二维阵列:
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
和{C
。如果您能帮助我知道npprint
应该如何实现上述任意维numpy ndarrays的输出,我将不胜感激?在
p.S.1.在Jupyter环境中,可以在降价中使用乳胶\mathtools
\underbracket
和{
p.S.2.有人告诉我,ndarray的印刷方式确实是一致的。不过,我觉得这是有线和非直观的。有一个灵活的漂亮的打印功能可以帮助以不同的形式显示日期。在
p.S.3.同伙已经考虑了我在这里提到的两点。它们的矩阵模是非常一致的(A1
和A2
是相同的),而且它们还有一个pprint
函数,它做了同样的事情,我希望从npprint这里得到。在
p.S.4.对于那些跟进这个想法的人,我在这里整合了所有的东西this Jupyter Notebook
对我来说,理解numpy数组与我心目中的MATLAB矩阵或多维数学数组完全不同,这是一个相当大的启示。它们是相当同质和统一的嵌套Python列表。我还了解到,numpy数组的第一个维度是最深的/内部的一对方括号,它水平打印,然后从那里垂直打印第二个维度,垂直打印第三个空间线。。。在
总之,我的东西有一个
ppring
函数(灵感来自Sympy的命名约定)可以帮助很多。因此,我将把一个非常糟糕的实现放在这里,希望它能激励其他高级Python想出更好的解决方案:对于一维和二维阵列,其结果在某种程度上是可以接受的:
^{pr2}$这确实是一个非常糟糕的代码,它只适用于整数。希望其他人能想出更好的解决办法。在
p.S.1.Eric Wieser已经为IPython/Jupiter实现了一个非常好的HTML原型,可以看到here:
您可以关注numpy邮件列表here上的讨论。在
p.S.2.我也发布了这个想法here on Reddit。在
p.S.3我花了一些时间将代码扩展到3D维数组:
举个例子:
在每种情况下,最终尺寸的每个实例都打印在一行上。这里没有不一致的地方。在
尝试各种形式:
更改}形状中的最后一个整数。在
a
中的维数(例如,通过添加更多由逗号分隔的整数)。您会发现,每次打印a
,打印对象中的每一行都有k
值,其中k
是{相关问题 更多 >
编程相关推荐