3

次の単純なクラスを考えてみます。

class Quantity(object):

    def __init__(self, value, unit):
        self.unit = unit
        self.value = value

    def __getitem__(self, key):
        return Quantity(self.value[key], unit=self.unit)

    def __len__(self):
        return len(self.value)

インスタンスを作成します。

import numpy as np
q = Quantity(np.array([1,2,3]), 'degree')
print(repr(np.array(q)))

Quantity次に、このオブジェクトを Numpy に渡すと、オブジェクトが 3 つのインスタンスのオブジェクト配列に分割されます。

array([<__main__.Quantity object at 0x1073a0d50>,
       <__main__.Quantity object at 0x1073a0d90>,
       <__main__.Quantity object at 0x1073a0dd0>], dtype=object)

これは、 メソッド__len____getitem__メソッドが存在するためです。いずれかを削除すると、オブジェクトは分割されません。

array(<__main__.Quantity object at 0x110a4e610>, dtype=object)

__len__と を引き続き保持したいの__getitem__ですが、Numpy がオブジェクトを分割しないようにする方法はありますか?

編集: ndarray サブクラスを作成する以外ソリューションに興味がありますQuantity

4

1 に答える 1

2

これはあなたが探しているものですか?

class Quantity(object):

    def __init__(self, value, unit):
        self.unit = unit
        self.value = value

    def __getitem__(self, key):
        return Quantity(self.value[key], unit=self.unit)

    def __len__(self):
        return len(self.value)

    def __array__(self):
        return self.value

np.array__array__メソッドを使用します

In [11]: q
Out[11]: <__main__.Quantity at 0x1042bdf90>

In [12]: np.array(q)
Out[12]: array([ 1.,  2.,  3.])

In [13]: print(repr(np.array(q)))
array([ 1.,  2.,  3.])

In [14]: len(q)
Out[14]: 3

In [15]: q[1]
Out[15]: <__main__.Quantity at 0x1042bdd50>

In [16]: q[0]
Out[16]: <__main__.Quantity at 0x1042bdd90>

In [17]: q[0].value
Out[17]: 1.0
于 2013-07-03T19:12:01.017 に答える