我的numpy数组更紧凑__repr__吗?

时间:2018-11-15 06:17:52

标签: python python-2.7 numpy

当我显示一个数组时,__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?

1 个答案:

答案 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!