1

get-item-by-index 動作を変更する numpy.ndarray のサブクラスがあります。ただし、誰かが私のサブクラスで印刷するときに、元の ndarray 出力形式を保持したいと考えています。__iter__ 関数をオーバーライドしようとしましたが、うまくいかないようです。__getitem__ がオーバーロードされている場合、基になる配列の順序で数値を出力することは可能ですか?

import numpy as np

class imarray(np.ndarray):
    def __new__(cls, d, f):
        nd = np.asarray(d)
        return super(imarray, cls).__new__(cls,(nd.size,), dtype=nd.dtype, buffer=nd).view(imarray)
    def __init__(self, d, f):
        self.f = f
    def __array_finalize__(self, o):
        pass
    def __getitem__(self, i):
        return super(imarray, self).__getitem__(self.f(i))
    def __setitem__(self, i, y):
        return super(imarray, self).__setitem__(self.f(i), y)
    def __iter__(self):
        return super(imarray, self).__iter__

if __name__ == "__main__":
    a = imarray([1., 2., 3.1415], lambda i:i+1)
    print a[0] # print .2
    a[-1] =.4
    print a[-1] # print .4
    print a # print [ 2. 3.1415 0.4 ] but want [ 0.4 2. 3.1415 ]
4

2 に答える 2

2

Print はオブジェクト__str__メソッドを返します。

したがって、 ovveride する必要があります__str__

>>> class ex():
    def __init__(self, value):
        self.val = value
    def __str__(self):
        return self.val * 2


>>> a = ex('A')
>>> print a
AA
于 2013-03-05T09:38:32.357 に答える
1

実際には依存します。

オブジェクトを印刷すると、そのメソッドprintが呼び出され__str__ます。

ただし、list(またはsetまたはdict)を印刷するprintと、リストの__str__メソッドが呼び出され、次にアイテムの__repr__メソッドが呼び出されます。奇妙ですが、非常に簡単に観察できます。

>>> class B():
...     def __repr__(self): return '__repr__'
...     def __str__(self): return '__str__'
...
>>> print B()
__str__
>>> print [B()]
[__repr__]
>>> print set([B()])
set([__repr__])
>>> print {B(): B()}
{__repr__: __repr__}
于 2013-03-05T09:50:33.737 に答える