当我显示一个数组时,__repr__()
对象的默认ndarray
方法对于我想做的事情来说太大了:
a = np.eye(32)
b = {'hello':42, 'array':a}
b
产生:
{'array': array([[ 1., 0., 0., ..., 0., 0., 0.],
[ 0., 1., 0., ..., 0., 0., 0.],
[ 0., 0., 1., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 1., 0., 0.],
[ 0., 0., 0., ..., 0., 1., 0.],
[ 0., 0., 0., ..., 0., 0., 1.]]), 'hello': 42}
我尝试了一个难看的解决方案,重新分配了__repr__
:
def wow():
return "wow!"
a.__repr__ = wow
这会产生归因错误,我并不感到惊讶:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
a.__repr__ = wow
AttributeError: 'numpy.ndarray' object attribute '__repr__' is read-only
我可以使用自己想要的自定义 repr 来制作课程:
class NP(object):
def __init__(self, a):
self.a = a
def __repr__(self):
s0, s1 = self.a.shape
dtp = self.a.dtype
return '{}x{} {}'.format(s0, s1, dtp)
A = NP(a)
A
现在产生:
32x32 float64
但是小问题是我现在必须在任何地方访问该属性。 A.sum()失败,A.a.sum()起作用。
有没有一种方法可以直接使用NumPy?
答案 0 :(得分:4)
使用np.set_string_function
:
>>> def __repr__(self):
... s0, s1 = self.shape
... dtp = self.dtype
... return '{}x{} {}'.format(s0, s1, dtp)
...
>>> np.set_string_function(__repr__)
>>> np.identity(5)
5x5 float64
要获得更高级的显示效果,您可能需要看看reprlib
。
另一方面,如果您想要使其更短一点,np.set_printoptions
可能是您最简单的选择。
如果您只需要将此方法应用于数组的子集,那么子类化确实是您的最佳选择。但是,我不确定numpy的子类的当前状态是什么。至少可以说它充满了微妙之处。
>>> class myarray(np.ndarray):
... def __repr__(self):
... return "wow!"
...
>>> np.identity(5).view(myarray)
wow!