4

オブジェクトで満たされた NumPy 配列を作成しようとしていますが、オブジェクトごとに配列全体にブロードキャストして何かを行う方法があるかどうか疑問に思っていました。

コード:

class player:
    def __init__(self,num = 5):
        self.num = num

    def printnum():
        print(self.num)
...

objs = np.array([player(5),player(6)],dtype=Object)
objs.printnum()

そのままでは、これはエラーを返します。マニュアルに従って dtype を _object に変更しようとしましたが、何も機能していないようです。

4

2 に答える 2

2

オブジェクトの numpy 配列は、そのオブジェクトのメソッドを継承しません。ndarray一般に、メソッドは配列全体に作用します

これは、組み込み型でも機能しません。たとえば、次のようになります。

In [122]: import numpy as np

In [123]: n = 4.0

In [124]: a = np.arange(n)

In [125]: n.is_integer()
Out[125]: True

In [126]: a.is_integer()
---------------------------------------------------------------------------
AttributeError: 'numpy.ndarray' object has no attribute 'is_integer'

Numpy ブロードキャストは要素単位の演算子で行われます。たとえば、次のようになります。

In [127]: n
Out[127]: 4.0

In [128]: a
Out[128]: array([ 0.,  1.,  2.,  3.])

In [129]: n + a
Out[129]: array([ 4.,  5.,  6.,  7.])

print基本的に配列内のすべての要素を呼び出したい場合.__repr__()は、によって呼び出されるメソッドを単純に再定義できますprint。メソッドをオーバーライドすると情報が失われることに注意してください。

In [148]: class player:
   .....:     def __init__(self, num=5):
   .....:         self.num = num
   .....:     def __repr__(self):
   .....:         return str(self.num)
   .....:     

In [149]: objs = np.array([player(5), player(6)])

In [150]: objs
Out[150]: array([5, 6], dtype=object)

In [151]: print objs
[5 6]

そのように見えますが、これは同じではありませんnp.array([5,6]):

In [152]: objs * 3
----------------------
TypeError: unsupported operand type(s) for *: 'instance' and 'int'

そして、オーバーライドの欠点を見ることができます__repr__

これを行うより簡単な方法は、現在のprintnum()メソッドを使用することですが、ループで呼び出します。

In [164]: class player:
   .....:     def __init__(self, num=5):
   .....:         self.num = num
   .....:     def printnum(self):
   .....:         print(self.num)
   .....:         

In [165]: for p in objs:
   .....:     p.printnum()
   .....:
5
6

または、文字列を出力するのではなく文字列を返すようにメソッドを定義してから、リスト内包表記を作成します。

In [169]: class player:
   .....:     def __init__(self, num=5):
   .....:         self.num = num
   .....:     def printnum(self):
   .....:         return str(self.num)
   .....: 

In [170]: objs = np.array([player(5), player(6)])

In [171]: [p.printnum() for p in objs]
Out[171]: ['5', '6']
于 2013-04-04T15:49:20.067 に答える
1

コードのいくつかのタイプミス: argprintnum()が必要、および->selfObjectobject

class player:
    def __init__(self, num=5):
        self.num = num

    def printnum(self):
        print(self.num)


objs = np.array([player(5),player(6)], dtype=object)

# It's not a "broadcast" (what you mean is map), but it has the same result
# plus it's pythonic (explicit + readable)
for o in objs:
    o.printnum()

本当にやりたいことは、ジェネレーター オブジェクトを作成することのようです。グーグルpython generator yieldとあなたはこのようないくつかの例を得るでしょう

于 2013-04-04T04:50:16.933 に答える