numpy 数组表示和格式

numpy array representation and formatting

我正在处理一些文档并希望描绘这种形式的数组

>>> a_3d
array([[[4, 6, 4],
        [1, 1, 8],
        [0, 7, 5],
        [5, 3, 3],
        [8, 9, 5]],

       [[8, 8, 4],
        [3, 4, 4],
        [0, 0, 9],
        [3, 7, 3],
        [3, 4, 7]],

       [[9, 5, 4],
        [7, 7, 3],
        [9, 5, 9],
        [8, 7, 8],
        [5, 8, 8]]], dtype=int32)

以与我使用 MatPlotLib 作为 graph/map.

类似的方式作为文本

我设法简单地解压缩了原始数组,并在此表格中提供了一些附加信息。

array...
shape (3, 5, 3) ndim 3 size 45
a[0]...
[[[4 6 4]
  [1 1 8]
  [0 7 5]
  [5 3 3]
  [8 9 5]]
a[1]....
 [[8 8 4]
  [3 4 4]
  [0 0 9]
  [3 7 3]
  [3 4 7]]
a[2]....
 [[9 5 4]
  [7 7 3]
  [9 5 9]
  [8 7 8]
  [5 8 8]]]

但我已经尝试了重塑、转置的每一种组合,以使其成为行表示。我还没有找到解决方案,除了从第一原理重建数组,使三个二维块出现在一行中。

同样,这是为了教学和可视化目的,而不是为了分析。如果我忽略了显而易见的内容,我将不胜感激。

编辑

 [[[4, 6, 4],  [[8, 8, 4],   [[9, 5, 4],
   [1, 1, 8],     
   [0, 7, 5],     etc            etc
   [5, 3, 3],
   [8, 9, 5]],  [3, 4, 7]],   [5, 8, 8]]]

或类似...如果这有帮助 显然我正在使用的 kludge 解决方法可能会有所帮助,使用原始数据并对其进行重组会很好,而不是不得不说......我们会转而使用列表和对象数组一段时间......

def to_row(a):
    """ kludge workaround   """
    n, rows, cols = a.shape
    e = np.empty((rows, cols), dtype='object')
    for r in range(rows):
        for c in range(cols):
            e[r][c] = (a[c][r]).tolist()
    return e

所以你有一个形状为 (3,5,3) 的数组,默认数组函数显示它有 3 个平面,每个平面是一个 (5,3) 二维数组。

整形和转置不会改变这种基本显示格式 - 它仍然会在第一个轴上拆分数组,并格式化每个块。

格式化由内置的 numpy 函数处理:

In [112]: arr=np.arange(2*3*4).reshape(2,3,4)

In [113]: arr.__format__('')
Out[113]: '[[[ 0  1  2  3]\n  [ 4  5  6  7]\n  [ 8  9 10 11]]\n\n [[12 13 14 15]\n  [16 17 18 19]\n  [20 21 22 23]]]'

np.array2string(arr) 生成相同的字符串。

可以想象,您可以在 \n 上拆分此字符串,然后重新排列。

In [116]: np.get_printoptions()
Out[116]: 
{'edgeitems': 3,
 'formatter': None,
 'infstr': 'inf',
 'linewidth': 75,
 'nanstr': 'nan',
 'precision': 8,
 'suppress': False,
 'threshold': 1000}

set_options 函数的文档描述了这些值。您也可以查看 np.set_string_function


这是重新排列线条的第一次尝试:

In [137]: astr=np.array2string(arr)
In [138]: lines=astr.splitlines()
In [139]: lines
Out[139]: 
['[[[ 0  1  2  3]',
 '  [ 4  5  6  7]',
 '  [ 8  9 10 11]]',
 '',
 ' [[12 13 14 15]',
 '  [16 17 18 19]',
 '  [20 21 22 23]]]']

In [140]: print '\n'.join(['   '.join((lines[i],lines[i+4])) for i in range(3)]) 
[[[ 0  1  2  3]    [[12 13 14 15]
  [ 4  5  6  7]     [16 17 18 19]
  [ 8  9 10 11]]     [20 21 22 23]]]

括号需要清理,但整体形状看起来不错。

获得这样一组线的另一种方法是格式化每个平面:

In [151]: alist=[np.array2string(i).splitlines() for i in arr]

In [152]: alist
Out[152]: 
[['[[ 0  1  2  3]', ' [ 4  5  6  7]', ' [ 8  9 10 11]]'],
 ['[[12 13 14 15]', ' [16 17 18 19]', ' [20 21 22 23]]']]

In [153]: zip(*alist)   # a list form of transpose
Out[153]: 
[('[[ 0  1  2  3]', '[[12 13 14 15]'),
 (' [ 4  5  6  7]', ' [16 17 18 19]'),
 (' [ 8  9 10 11]]', ' [20 21 22 23]]')]

然后就可以加入了。 \t(制表符)清理括号间距。

In [155]: '\n'.join(['\t'.join(k) for k in zip(*alist)])
Out[155]: '[[ 0  1  2  3]\t[[12 13 14 15]\n [ 4  5  6  7]\t [16 17 18 19]\n [ 8  9 10 11]]\t [20 21 22 23]]'

In [156]: print _
[[ 0  1  2  3]  [[12 13 14 15]
 [ 4  5  6  7]   [16 17 18 19]
 [ 8  9 10 11]]  [20 21 22 23]]

3 个街区 - 它仍然需要工作:(

In [157]: arr1=np.arange(2*3*4).reshape(3,4,2)
In [158]: alist=[np.array2string(i).splitlines() for i in arr1]
In [159]: print '\n'.join(['\t'.join(k) for k in zip(*alist)])
[[0 1]  [[ 8  9]    [[16 17]
 [2 3]   [10 11]     [18 19]
 [4 5]   [12 13]     [20 21]
 [6 7]]  [14 15]]    [22 23]]

从某种意义上说,这与您想要在列中显示文本时遇到的问题相同。可能有一个多列打印实用程序。 即使您考虑并排放置块,显示仍然基于线条。