<p>对我来说,理解numpy数组与我心目中的MATLAB矩阵或多维数学数组完全不同,这是一个相当大的启示。它们是相当同质和统一的嵌套Python列表。我还了解到,numpy数组的第一个维度是最深的/内部的一对方括号,它水平打印,然后从那里垂直打印第二个维度,垂直打印第三个空间线。。。在</p>
<p>总之,我的东西有一个<code>ppring</code>函数(灵感来自Sympy的命名约定)可以帮助很多。因此,我将把一个非常糟糕的实现放在这里,希望它能激励其他高级Python想出更好的解决方案:</p>
<pre><code>def pprint(A):
if A.ndim==1:
print(A)
else:
w = max([len(str(s)) for s in A])
print(u'\u250c'+u'\u2500'*w+u'\u2510')
for AA in A:
print(' ', end='')
print('[', end='')
for i,AAA in enumerate(AA[:-1]):
w1=max([len(str(s)) for s in A[:,i]])
print(str(AAA)+' '*(w1-len(str(AAA))+1),end='')
w1=max([len(str(s)) for s in A[:,-1]])
print(str(AA[-1])+' '*(w1-len(str(AA[-1]))),end='')
print(']')
print(u'\u2514'+u'\u2500'*w+u'\u2518')
</code></pre>
<p>对于一维和二维阵列,其结果在某种程度上是可以接受的:</p>
^{pr2}$
<p>这确实是一个非常糟糕的代码,它只适用于整数。希望其他人能想出更好的解决办法。在</p>
<p><strong>p.S.1.</strong><a href="https://twitter.com/EricWieser" rel="nofollow noreferrer">Eric Wieser</a>已经为IPython/Jupiter实现了一个非常好的HTML原型,可以看到<a href="https://notebooks.azure.com/eric-wieser/libraries/numpy-integration" rel="nofollow noreferrer">here</a>:</p>
<p><a href="https://i.stack.imgur.com/mGCuW.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/mGCuW.gif" alt="enter image description here"/></a></p>
<p>您可以关注numpy邮件列表<a href="https://mail.python.org/pipermail/numpy-discussion/2018-November/078935.html" rel="nofollow noreferrer">here</a>上的讨论。在</p>
<p><strong>p.S.2.</strong>我也发布了这个想法<a href="https://www.reddit.com/r/Python/comments/9un3bz/pretty_printing_of_numpy_ndarrays_descriptions_in/" rel="nofollow noreferrer">here on Reddit</a>。在</p>
<p><strong>p.S.3</strong>我花了一些时间将代码扩展到3D维数组:</p>
<pre><code>def ndtotext(A, w=None, h=None):
if A.ndim==1:
if w == None :
return str(A)
else:
s= '['
for i,AA in enumerate(A[:-1]):
s += str(AA)+' '*(max(w[i],len(str(AA)))-len(str(AA))+1)
s += str(A[-1])+' '*(max(w[-1],len(str(A[-1])))-len(str(A[-1]))) +'] '
elif A.ndim==2:
w1 = [max([len(str(s)) for s in A[:,i]]) for i in range(A.shape[1])]
w0 = sum(w1)+len(w1)+1
s= u'\u250c'+u'\u2500'*w0+u'\u2510' +'\n'
for AA in A:
s += ' ' + ndtotext(AA, w=w1) +'\n'
s += u'\u2514'+u'\u2500'*w0+u'\u2518'
elif A.ndim==3:
h=A.shape[1]
s1=u'\u250c' +'\n' + (u'\u2502'+'\n')*h + u'\u2514'+'\n'
s2=u'\u2510' +'\n' + (u'\u2502'+'\n')*h + u'\u2518'+'\n'
strings=[ndtotext(a)+'\n' for a in A]
strings.append(s2)
strings.insert(0,s1)
s='\n'.join(''.join(pair) for pair in zip(*map(str.splitlines, strings)))
return s
</code></pre>
<p>举个例子:</p>
<pre><code>shape = 4, 3, 6
B2=np.arange(np.prod(shape)).reshape(shape)
print(B2)
print(ndtotext(B2))
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]]
[[18 19 20 21 22 23]
[24 25 26 27 28 29]
[30 31 32 33 34 35]]
[[36 37 38 39 40 41]
[42 43 44 45 46 47]
[48 49 50 51 52 53]]
[[54 55 56 57 58 59]
[60 61 62 63 64 65]
[66 67 68 69 70 71]]]
┌┌───────────────────┐┌───────────────────┐┌───────────────────┐┌───────────────────┐┐
│ [0 1 2 3 4 5 ] [18 19 20 21 22 23] [36 37 38 39 40 41] [54 55 56 57 58 59] │
│ [6 7 8 9 10 11] [24 25 26 27 28 29] [42 43 44 45 46 47] [60 61 62 63 64 65] │
│ [12 13 14 15 16 17] [30 31 32 33 34 35] [48 49 50 51 52 53] [66 67 68 69 70 71] │
└└───────────────────┘└───────────────────┘└───────────────────┘└───────────────────┘┘
</code></pre>