漂亮的打印和替换 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 版本,了解 numpy
的 ndarray
对象,并以这种方式打印它们你想要他们。
我所做的是打开 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'])]
假设我正在打印一个 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 版本,了解 numpy
的 ndarray
对象,并以这种方式打印它们你想要他们。
我所做的是打开 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'])]