漂亮的打印和替换 numpy 数组

Pretty print and substitute numpy arrays

假设我正在打印一个 JSON 解码的对象,其结构如下:

{Stack
   Layer
     Material
       <array>
}

其中这些变量对应于模拟中的结构层次结构。在层次结构的末尾,有一个 numpy 数组对象。这些数组往往非常大,所以我宁愿不显式打印它们,而是打印一个摘要。所以代替:

{Stack
   Layer
     Material
       array([1,2,3,4,5......])
}

看起来像:

{Stack
   Layer
     Material
       array: dtype, shape
}

IE pretty print 不会打印完整的数组,而是通过打印形状和数据类型来总结它的信息。 prettyprint 中是否提供此类自定义?

好的,我是分子生物学家,不是专业的程序员,所以请耐心等待。
在我非常幼稚的观点中,你不应该考虑太多,其中一种选择是制作你自己的 pprint 版本,了解 numpyndarray 对象,并以这种方式打印它们你想要他们。

我所做的是打开 pprint 模块(在 Lib 目录下)并创建一个修改后的副本,如下所示:

(我把修改后的工作代码粘贴到 pastebin 上,你可以找到它here

首先,在导入部分,让它尝试导入 numpy 的 ndarray,添加:

try:
    from numpy import ndarray
    np_arrays = True
except ImportError:
    np_arrays = False

然后,在_format函数的定义中,对after这个:

# This is already there
if self._depth and level > self._depth:
    write(rep)
    return

(所以在我的副本的第 154 行,在导入之后)你应该添加:

# Format numpy.ndarray object representations
if np_arrays and issubclass(typ, ndarray):
    write('array(dtype:' + str(object.dtype))
    write('; shape: ' + str(object.shape) + ')')
    return

(然后函数继续 r = getattr(typ, "__repr__", None)...)

现在将此脚本保存在 pprint 所在的同一 Lib 目录中,并使用新名称,例如 mypprint.py 然后尝试:

from mypprint import pprint
pprint.pprint(object_with_np.arrays)  

你还在关注这个问题吗? 我一直在想,如果你想让它更便携,你可以保持 pprint 模块不变,只需在脚本中为 _format 方法添加一个装饰器,即:

import pprint
import numpy as np

def ndarray_catch(original_format_func):
    def _format(*argv):
        myobj = argv[1]
        if issubclass(type(myobj), np.ndarray):
            array_text = 'array(dtype:' + str(myobj.dtype)
            array_text +='; shape:' + str(myobj.shape) + ')'
            argv = list(argv)
            argv[1] = array_text
        return original_format_func(*argv)
    return _format

pprint.PrettyPrinter._format = ndarray_catch(pprint.PrettyPrinter._format)

试试:

my_list = [1, 2, {3:4, 5:"I like to import antigravity"}, \
           ["this is a very very long text", "smalltext", 
            np.array([[7,8], [9, 10]])], ("here", "there", ["everywhere"])]    
pprint.pprint(my_list)

输出为:

[1,
 2,
 {3: 4, 5: 'I like to import antigravity'},
 ['this is a very very long text',
  'smalltext',
  'array(dtype:int32; shape:(2L, 2L))'],
 ('here', 'there', ['everywhere'])]