numpy数组表示和格式

时间:2016-03-22 02:29:15

标签: arrays numpy string-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作为图形/地图。

array viewed as row

我设法简单地解压缩原始数组并在此表单中提供一些其他信息。

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]]]

但是我已经尝试了重塑的所有组合,转置以使其成为行表示。我没有找到一个灵魂,没有从第一原理重建阵列,以便三个2D块出现在一行中。

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

修改

 [[[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

1 个答案:

答案 0 :(得分:1)

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

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

格式化由内置的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]]

从某种意义上说,当您想要在列中显示文本时,它与文本存在同样的问题。可能有多列打印实用程序。   即使您正在考虑并排的块,显示仍然基于线。